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

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

生活随笔

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

编程问答

模版:替罪羊树

發(fā)布時(shí)間:2023/12/3 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模版:替罪羊树 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 注意事項(xiàng)
  • 代碼

所謂替罪羊樹(shù),就是有一頭替罪羊的樹(shù)

(逃)

前言

在看完了一大堆各種平衡樹(shù)的教程之后,決定學(xué)一個(gè)這個(gè)
因?yàn)樗幸粋€(gè)很關(guān)鍵的好處:無(wú)須旋轉(zhuǎn)
可以在pushup復(fù)雜度太惡心的題中做到splay做不到的事情
比如平衡樹(shù)套線段樹(shù)
但是在區(qū)間問(wèn)題中還是splay最強(qiáng)啦!

注意事項(xiàng)

  • 拍扁操作必須是未被刪除的點(diǎn)
  • 拍扁時(shí)要記錄點(diǎn)的副本數(shù)量!
  • 代碼

    #include<bits/stdc++.h> using namespace std; #define ll long long #define il inline const int N=5e6+100; const int M=150; const int mod=998244353; inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } int n,m; int ls[N],rs[N],siz[N],val[N],cnt[N],de[N],tot,rub[N],top,r; int q[N],num,o[N]; il int New(int v,int oo){int x=top?rub[top--]:++tot;ls[x]=rs[x]=0;siz[x]=cnt[x]=oo;val[x]=v;de[x]=0;return x; } il void pushup(int x){siz[x]=siz[ls[x]]+siz[rs[x]]+cnt[x];de[x]=cnt[x]?0:1;if(ls[x]) de[x]+=de[ls[x]];if(rs[x]) de[x]+=de[rs[x]];return; } il int build(int l,int r){if(l>r) return 0;int mid=(l+r)>>1;int k=New(q[mid],o[mid]);ls[k]=build(l,mid-1);rs[k]=build(mid+1,r);pushup(k);return k; } il void pia(int x){if(!x) return;pia(ls[x]);if(cnt[x]){q[++num]=val[x];o[num]=cnt[x];}pia(rs[x]);rub[++top]=x;return; } const double A=0.7; il void check(int &x){if(!cnt[x]) return;if(siz[x]*A<siz[ls[x]]||siz[x]*A<siz[rs[x]]||siz[x]<=de[x]){num=0;pia(x);x=build(1,num);}return; } il void ins(int &k,int v){if(!k){k=New(v,1);return;}if(v==val[k]){cnt[k]++;pushup(k);return;}else if(v<=val[k]) ins(ls[k],v);else ins(rs[k],v);pushup(k);check(k);return; } il void del(int k,int v){if(!k) return;if(v==val[k]){cnt[k]--;pushup(k);return;}if(v<val[k]) del(ls[k],v);else del(rs[k],v);pushup(k);check(k);return; } il int findrnk(int k,int v){if(!k) return 1;if(v==val[k]) return siz[ls[k]]+1;else if(v<val[k]) return findrnk(ls[k],v);else return siz[ls[k]]+cnt[k]+findrnk(rs[k],v); } il int findnth(int k,int kth){//printf("k=%d kth=%d\n",k,kth);if(kth<=siz[ls[k]]) return findnth(ls[k],kth);else if(kth<=siz[ls[k]]+cnt[k]) return val[k];else return findnth(rs[k],kth-siz[ls[k]]-cnt[k]); } il int findpre(int x){//printf("rnk=%d\n",findrnk(r,x));return findnth(r,findrnk(r,x)-1); } il int findnxt(int x){return findnth(r,findrnk(r,x+1)); } void print(int k){if(!k) return;printf("k=%d val=%d ls=%d rs=%d siz=%d cnt=%d\n",k,val[k],ls[k],rs[k],siz[k],cnt[k]);print(ls[k]);print(rs[k]);if(k==r) putchar('\n'); } int main(){n=read();for(int i=1;i<=n;i++){int op=read(),x=read();switch(op){case 1:{ins(r,x);break;}case 2:{del(r,x);break;}case 3:{printf("%d\n",findrnk(r,x));break;}case 4:{printf("%d\n",findnth(r,x));break;}case 5:{printf("%d\n",findpre(x));break;}case 6:{printf("%d\n",findnxt(x));break;}}//print(r);}return 0; } /* 9 1 10 1 10 1 15 3 5 */

    總結(jié)

    以上是生活随笔為你收集整理的模版:替罪羊树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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