【BZOJ 1208】[HNOI2004]寵物收養所
阿新 • • 發佈:2018-04-09
def 不用 multi name pri 等於 題解 ble ret
【鏈接】 我是鏈接,點我呀:)
【題意】
在這裏輸入題意
【題解】
用set搞。
(因為規定了不會有相同特點值的東西。
所以可以不用multiset.
那麽每次用lower_bound找離它最近的配對就好了
【代碼】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD = 1000000;
int n;
set<ll> myset[2];
ll ans = 0;
int main()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++){
int a,b;
scanf("%d%d",&a,&b);
myset[a].insert(b);
for (int j = 0;j<=1;j++)
if ((int)myset[j].size()==1 && (int)myset[1-j].size()>0){
ll x = (*myset[j].begin());
myset[j].erase(myset[j].begin());
set<ll>::iterator temp = myset[1 -j].lower_bound(x);
if (temp==myset[1-j].begin()){
//全都大於等於x
ans = (ans+(*temp)-x)%MOD;
myset[1-j].erase(temp);
break;
}else if (temp==myset[1-j].end()){
//全都比x來的小
temp--;
ans= (ans + x-(*temp))%MOD;
myset[1 -j].erase(temp);
}else{
ll temp1 = abs(x-(*temp));
temp--;
ll temp2 = abs(x-(*temp));
if (temp2<=temp1){
ans=(ans + temp2)%MOD;
myset[1-j].erase(temp);
}else{
ans=(ans + temp1)%MOD;
temp++;
myset[1-j].erase(temp);
}
}
}
}
printf("%lld\n",ans);
return 0;
}
【BZOJ 1208】[HNOI2004]寵物收養所