国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

SplayTree

2019-11-14 12:11:05
字體:
來源:轉載
供稿:網友

Splay是個好東西,中文譯名為伸展樹,它除了擁有Treap的功能外,還也可以實現快速分裂和合并序列。(學之前最好先對BST和Treap有一定了解) 最重要的是理解Splay的伸展操作,即將一個指定節點x自底向上通過旋轉操作,使x成為根節點,要分三種情況來考慮: 1、x的節點為父節點,進行一次單旋即可; 2、x的父節點y、y的父節點z在一條直線上如下圖: 這里寫圖片描述 3、x,y,z不在一條直線上,形成一個“Z”形如下圖: 這里寫圖片描述 (好吧圖確時有點那個啥,不過這不是重點,理解就好) 上代碼:

//codevs2048#include <cstdio>#include <algorithm>#define maxn 100000+5using namespace std;int num,n,l,r,m,root,x,hh,ll,rr,mid,o;struct xx{ int ch[2],r,v,flag,sz;}a[maxn];int cmp(int t,int x){ hh=a[a[t].ch[0]].sz+1; if (hh==x) return -1; return x<hh?0:1; }void pushdown(int t){ if (a[t].flag) { a[t].flag=0; swap(a[t].ch[0],a[t].ch[1]); a[a[t].ch[0]].flag^=1; a[a[t].ch[1]].flag^=1; }}void maintain(int t){ a[t].sz=a[a[t].ch[0]].sz+a[a[t].ch[1]].sz+1;}void rotate(int &t,int d){ int k=a[t].ch[d^1]; a[t].ch[d^1]=a[k].ch[d]; a[k].ch[d]=t; a[k].sz=a[t].sz; maintain(t); t=k;}void insert(int &t,int x){ if (!t){a[t=++num]=(xx){0,0,rand(),x,0,1};return ;} a[t].sz++; insert(a[t].ch[1],x); if (a[a[t].ch[1]].r>a[t].r)rotate(t,0);}void splay(int &t,int k){ pushdown(t); int d=cmp(t,k); if (d==1) k-=a[a[t].ch[0]].sz+1; if (d!=-1) { int p=a[t].ch[d]; pushdown(p); int d2=cmp(p,k); int k2=(d2==0?k:k-a[a[p].ch[0]].sz-1); if (d2!=-1) { splay(a[p].ch[d2],k2);//not splay(p,k2)!!!!! if (d==d2) rotate(a[t].ch[d],d^1); else rotate(a[t].ch[d],d); } rotate(t,d^1); }}//合并 void _merge(int &left,int &right){ splay(left,a[left].sz); a[left].ch[1]=right; maintain(left); root=left;}//分裂 void split(int &t,int k,int &left,int &right){ splay(t,k); left=t; right=a[t].ch[1]; a[t].ch[1]=0; maintain(t);}void PRint(int t){ if (!t) return ; pushdown(t); print(a[t].ch[0]); if (a[t].v!=-23333333)printf("%d ",a[t].v); print(a[t].ch[1]);}int main(){ scanf("%d%d",&n,&m); insert(root,-23333333); for (int i=0;i<n;i++) scanf("%d",&x),insert(root,x); while (m--) { scanf("%d%d",&l,&r); split(root,l,ll,o); split(o,r-l+1,mid,rr); a[mid].flag^=1; _merge(ll,mid); _merge(root,rr); } print(root); return 0; }

這里寫圖片描述這里寫圖片描述 這里寫圖片描述這里寫圖片描述 hhh


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祁门县| 锡林浩特市| 闸北区| 加查县| 阿拉善右旗| 萍乡市| 靖江市| 鹤岗市| 中牟县| 阿合奇县| 安阳县| 元氏县| 永仁县| 防城港市| 敦煌市| 临邑县| 东乡县| 阿瓦提县| 射阳县| 胶南市| 宁阳县| 乐山市| 永川市| 霞浦县| 吴江市| 玛曲县| 大安市| 辽阳县| 肥东县| 广南县| 无棣县| 大竹县| 泸西县| 上蔡县| 平乐县| 宜兰市| 崇仁县| 肃南| 墨竹工卡县| 阳春市| 万源市|