P2286 [HNOI2004]宠物收养场
生活随笔
收集整理的這篇文章主要介紹了
P2286 [HNOI2004]宠物收养场
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我是題面
題意簡(jiǎn)單明了,兩種數(shù),如果加入一個(gè)數(shù)的時(shí)候有另一種數(shù)還存在,那就取出另一種數(shù)中與這個(gè)數(shù)差值的絕對(duì)值最小的將其刪除(多個(gè)則取較小),并對(duì)答案產(chǎn)生它們差值的絕對(duì)值的貢獻(xiàn),如果沒(méi)有另一種數(shù)存在,那就先將這個(gè)數(shù)存下
平衡樹(shù)裸題,直接兩個(gè)平衡樹(shù)維護(hù)就ok了,一個(gè)也能維護(hù),稍麻煩一點(diǎn)
線段樹(shù)好像也可做,我沒(méi)寫(xiě),應(yīng)該不難
我寫(xiě)的是Splay,把Splay用結(jié)構(gòu)體封裝好,開(kāi)兩個(gè)Splay異常好寫(xiě)
下面放代碼
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cctype> #define ll long long #define gc getchar #define maxn 80005 #define mo 1000000 using namespace std;inline ll read(){ll a=0;int f=0;char p=gc();while(!isdigit(p)){f|=p=='-';p=gc();}while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}return f?-a:a; }int n;ll ans;struct ahaha{ //Splay的結(jié)構(gòu)體struct ahaha1{int sz,cnt,ch[2];ll v;}t[maxn];int rt,tot,f[maxn];#define lc t[i].ch[0]#define rc t[i].ch[1]inline int get(int i){return i==t[f[i]].ch[1];}inline void update(int i){t[i].sz=t[i].cnt+t[lc].sz+t[rc].sz;}inline void del(int i){t[i].v=t[i].sz=t[i].cnt=f[i]=0;}inline int newnode(ll v){int i=++tot;t[i].sz=t[i].cnt=1;t[i].v=v;return i;}inline void rotate(int x){int y=f[x],z=f[y],k=get(x);f[x]=z;f[t[x].ch[k^1]]=y;f[y]=x;if(z)t[z].ch[y==t[z].ch[1]]=x;t[y].ch[k]=t[x].ch[k^1];t[x].ch[k^1]=y;update(y);update(x);}void Splay(int x){for(int y=f[x];f[x];rotate(x),y=f[x]){if(f[y])rotate(get(x)==get(y)?y:x);rt=x;}}void insert(ll v){int i=rt,k;if(!rt){rt=newnode(v);return;}while(1){k=v>t[i].v;if(v==t[i].v){++t[i].sz;++t[i].cnt;Splay(i);return;}if(!t[i].ch[k]){t[i].ch[k]=newnode(v);f[t[i].ch[k]]=i;Splay(t[i].ch[k]);return;}i=t[i].ch[k];}}void find(ll v){int i=rt;while(1){if(v<t[i].v){i=lc;if(!i)return;}else{if(!rc||v==t[i].v){Splay(i);return ;}i=rc;}}}inline void earase(ll v){find(v);int old=rt,i=rt;if(t[rt].cnt!=1){--t[rt].cnt;return;}if(t[rt].sz==1){del(rt);rt=0;return;}if(!lc){rt=rc;f[rt]=0;del(old);return;}if(!rc){rt=lc;f[rt]=0;del(old);return;}i=lc;while(rc)i=rc;Splay(i);t[rt].ch[1]=t[old].ch[1];f[t[rt].ch[1]]=rt;del(old);update(rt);}ll pre(ll v){int i=rt;ll maxa=-1;while(i){if(t[i].v==v)return v;if(t[i].v<v){maxa=max(maxa,t[i].v);i=rc;}else i=lc;}return maxa;}ll next(ll v){int i=rt;ll mina=2147483649;while(i){if(t[i].v==v)return v;if(t[i].v>v){mina=min(mina,t[i].v);i=lc;}else i=rc;}return mina;} }t1,t2;inline void solve_1(){ll v=read();if(!t2.rt) //如果沒(méi)有另一種數(shù),先存起來(lái)t1.insert(v);else{ll pre=t2.pre(v),next=t2.next(v); //查詢(xún)前后綴,沒(méi)有前綴則前綴為-1,沒(méi)有后綴則后綴為2147483649if(pre==-1){ans=(ans+next-v)%mo;t2.earase(next);return;}if(next==2147483649){ans=(ans+v-pre)%mo;t2.earase(pre);return;}if(v-pre<=next-v){ //按照題意取較小,然后刪除就可以了ans=(ans+v-pre)%mo;t2.earase(pre);return;}else{ans=(ans+next-v)%mo;t2.earase(next);return;}} } inline void solve_2(){ //同上ll v=read();if(!t1.rt)t2.insert(v);else{ll pre=t1.pre(v),next=t1.next(v);if(pre==-1){ans=(ans+next-v)%mo;t1.earase(next);return;}if(next==2147483649){ans=(ans+v-pre)%mo;t1.earase(pre);return;}if(v-pre<=next-v){ans=(ans+v-pre)%mo;t1.earase(pre);return;}else{ans=(ans+next-v)%mo;t1.earase(next);return;}} }int main(){n=read();while(n--){int zz=read();switch(zz){case 0:solve_1();break;case 1:solve_2();break;}}printf("%lld\n",ans);return 0; }不要抄代碼哦
轉(zhuǎn)載于:https://www.cnblogs.com/hanruyun/p/10248973.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的P2286 [HNOI2004]宠物收养场的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: codeforces 739E - Go
- 下一篇: 克拉克拉(KilaKila):大规模实时