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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

P2286 [HNOI2004]宠物收养场

發(fā)布時(shí)間:2024/9/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)寫,應(yīng)該不難

我寫的是Splay,把Splay用結(jié)構(gòu)體封裝好,開(kāi)兩個(gè)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) //如果沒(méi)有另一種數(shù),先存起來(lái)t1.insert(v);else{ll pre=t2.pre(v),next=t2.next(v); //查詢前后綴,沒(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ù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

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

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