#平衡树,set#洛谷 2286 [HNOI2004]宠物收养场
分析
由于宠物被领养者领养和领养者领养宠物操作是一样的,
考虑建两棵平衡树维护操作,以领养者领养宠物为例
若当前没有宠物,就将领养者加入平衡树中,
否则选择最接近的特点值的宠物统计答案并删除该宠物
代码
#include <cstdio>
#include <cctype>
#include <set>
#define rr register
using namespace std;
const int mod=1000000;
set<int>uk[2]; int ans;
set<int>::iterator it;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
for (rr int T=iut();T;--T){
rr int z=iut(),x=iut(),t1,t2;
if (uk[z^1].empty()) {uk[z].insert(x); continue;}
it=uk[z^1].begin(); if (x<(*it)) {ans=mo(ans,((*it)-x)%mod),uk[z^1].erase(it); continue;}
it=--uk[z^1].end(); if (x>(*it)) {ans=mo(ans,(x-(*it))%mod),uk[z^1].erase(it); continue;}
it=uk[z^1].lower_bound(x),t2=*it,--it,t1=*it;
if (x-t1<=t2-x) ans=mo(ans,(x-t1)%mod),uk[z^1].erase(it);
else ans=mo(ans,(t2-x)%mod),uk[z^1].erase(++it);
}
return !printf("%d",ans);
}