日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P2286 [HNOI2004]宠物收养场

發(fā)布時間:2024/9/5 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2286 [HNOI2004]宠物收养场 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我是題面

題意簡單明了,兩種數(shù),如果加入一個數(shù)的時候有另一種數(shù)還存在,那就取出另一種數(shù)中與這個數(shù)差值的絕對值最小的將其刪除(多個則取較小),并對答案產(chǎn)生它們差值的絕對值的貢獻,如果沒有另一種數(shù)存在,那就先將這個數(shù)存下

平衡樹裸題,直接兩個平衡樹維護就ok了,一個也能維護,稍麻煩一點

線段樹好像也可做,我沒寫,應(yīng)該不難

我寫的是Splay,把Splay用結(jié)構(gòu)體封裝好,開兩個Splay異常好寫

下面放代碼

#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) //如果沒有另一種數(shù),先存起來t1.insert(v);else{ll pre=t2.pre(v),next=t2.next(v); //查詢前后綴,沒有前綴則前綴為-1,沒有后綴則后綴為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ù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的P2286 [HNOI2004]宠物收养场的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。