[HNOI2004]宠物收养场
忘记取模我也是真的屑。
然后 set
是可做的,我就拿 set
做了。实际上写个平衡树也不怎么费事。
思路就是每次操作的时候看对面的树里有啥,有就取走,没有就把自己插入到这边的树里。
然后你真要说 set
有什么地方比平衡树麻烦,大概就是要细致处理边界一类的东西了。。。
这里不知道为什么 cmath
库里的 abs
与 %
冲突了,无奈写了个函数结果 UB 了,最后只能改成这个鬼样子/kk。
时间复杂度 $O(n\log n)$。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include<iostream> #include<cstdio> #include<set> #define ll long long using namespace std; namespace Ehnaev{ inline ll read() { ll ret=0,f=1;char ch=getchar(); while(ch<48||ch>57) {if(ch==45) f=-f;ch=getchar();} while(ch>=48&&ch<=57) {ret=(ret<<3)+(ret<<1)+ch-48;ch=getchar();} return ret*f; } inline void write(ll x) { static char buf[22];static ll len=-1; if(x>=0) {do{buf[++len]=x%10+48;x/=10;}while(x);} else {putchar(45);do{buf[++len]=-(x%10)+48;x/=10;}while(x);} while(len>=0) putchar(buf[len--]); } }using Ehnaev::read;using Ehnaev::write;
const ll mo=1e6;
inline ll abs_(ll x) {return x<0?-x:x;}
int main() {
set<ll> s0,s1; ll n,ans=0;n=read(); for(ll i=1;i<=n;i++) { ll op,x;op=read();x=read(); if(op==0) { if(!s1.empty()) { set<ll>::iterator it1,it2; it2=s1.lower_bound(x);it1=it2; ll tmp1=0,tmp2=0; if(it1!=s1.end()) tmp1=*it1; if(it2!=s1.begin()) tmp2=*--it2; if(!tmp1&&!tmp2) {s0.insert(x);continue;} if(!tmp1) {ans=(ans+abs_(tmp2-x))%mo;s1.erase(it2);continue;} if(!tmp2) {ans=(ans+abs_(tmp1-x))%mo;s1.erase(it1);continue;} if(abs_(tmp2-x)<=abs_(tmp1-x)) { ans=(ans+abs_(tmp2-x))%mo;s1.erase(it2);continue; } else { ans=(ans+abs_(tmp1-x))%mo;s1.erase(it1);continue; } } else s0.insert(x); } if(op==1) { if(!s0.empty()) { set<ll>::iterator it1,it2; it2=s0.lower_bound(x);it1=it2; ll tmp1=0,tmp2=0; if(it1!=s0.end()) tmp1=*it1; if(it2!=s0.begin()) tmp2=*--it2; if(!tmp1&&!tmp2) {s1.insert(x);continue;} if(!tmp1) {ans=(ans+abs_(tmp2-x))%mo;s0.erase(it2);continue;} if(!tmp2) {ans=(ans+abs_(tmp1-x))%mo;s0.erase(it1);continue;} if(abs_(tmp2-x)<=abs_(tmp1-x)) { ans=(ans+abs_(tmp2-x))%mo;s0.erase(it2);continue; } else { ans=(ans+abs_(tmp1-x))%mo;s0.erase(it1);continue; } } else s1.insert(x); } }
write(ans);
return 0; }
|