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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ3223文艺平衡树——非旋转treap

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ3223文艺平衡树——非旋转treap 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此為平衡樹系列第二道:文藝平衡樹您需要寫一種數據結構,來維護一個有序數列,其中需要提供以下操作:

翻轉一個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2,4]的話,結果是5 2 3 4 1

輸入

第一行為n,m n表示初始序列有n個數,這個序列依次是(1,2……n-1,n) m表示翻轉操作次數
接下來m行每行兩個數[l,r] 數據保證 1<=l<=r<=n

輸出

輸出一行n個數字,表示原始序列經過m次變換后的結果

樣例輸入

5 3 1 3 1 3 1 4

樣例輸出

4 3 2 1 5

提示

n,m<=100000

非旋轉treap相比于旋轉treap支持區間操作,所以對于這道題只需要每次把樹拆成[1~l-1]、[l~r]、[r+1~tot]三段,然后把[l~r]打上標記進行翻轉,再把三段區間合并就行了。對于打標記的點只有在查到這個點時才翻轉,如果一個點被打了兩次標記就相當于不翻轉。

最后附上代碼.

指針版

#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; char *p1,*p2,buf[100000]; #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++) int rd() {int x=0,f=1; char c=nc(); while(!isdigit(c)) {if(c=='-') f=-1; c=nc();} while(isdigit(c)) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;} ll rd2() {ll x=0,f=1; char c=nc(); while(!isdigit(c)) {if(c=='-') f=-1; c=nc();} while(isdigit(c)) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;} int n,m; int L,R; struct treap {int size;int rnd;int val;int rev;treap *ls,*rs;treap(){}treap(int k,treap *son){size=1;rnd=rand();val=k;ls=rs=son;rev=0;}void pushup(){size=ls->size+rs->size+1;}void pushdown(){if(rev){rev^=1;ls->rev^=1;rs->rev^=1;swap(ls,rs);}} }tr[100010],nil; typedef treap* node; node root,cnt,null; void init() {nil=treap(0,NULL);null=&nil;null->ls=null->rs=null;null->size=0;root=null;cnt=tr; } node build(int x) {*cnt=treap(x,null);return cnt++; } node merge(node x,node y) {if(x==null){return y; }if(y==null){return x;}x->pushdown();y->pushdown();if(x->rnd<y->rnd){x->rs=merge(x->rs,y);x->pushup();return x;}else{y->ls=merge(x,y->ls);y->pushup();return y;} } void split(node rt,node &x,node &y,int k) {if(rt==null){x=y=null;return ;}rt->pushdown();if(rt->ls->size>=k){y=rt;split(rt->ls,x,y->ls,k);rt->pushup();}else{x=rt;split(rt->rs,x->rs,y,k-rt->ls->size-1);rt->pushup();} } void print(node rt) {rt->pushdown();if(rt->ls!=null){print(rt->ls);}printf("%d",rt->val);if(--n!=0){printf(" ");}if(rt->rs!=null){print(rt->rs);} } node build_tree(int l,int r) {if(l==r){return build(l);}int mid=(l+r)>>1;return merge(build_tree(l,mid),build_tree(mid+1,r)); } int main() {init();n=rd();m=rd();root=build_tree(1,n);while(m--){L=rd();R=rd();node x,y,z;split(root,y,z,R);split(y,x,y,L-1);y->rev^=1;root=merge(merge(x,y),z);}print(root); }

非指針版

#include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<cstring> using namespace std; int n,m; int r[100010]; int v[100010]; int s[100010][3]; int size[100010]; bool d[100010]; int root; int tot; int L,R; int x,y,z; int flag; void pushup(int x) {size[x]=size[s[x][0]]+size[s[x][1]]+1; } int build(int x) {v[++tot]=x;r[tot]=rand();size[tot]=1;return tot; } void pushdown(int x) {swap(s[x][0],s[x][1]);if(s[x][0]){d[s[x][0]]^=1;}if(s[x][1]){d[s[x][1]]^=1;}d[x]=0; } int merge(int x,int y) {if(!x||!y){return x+y;}if(r[x]<r[y]){if(d[x]){pushdown(x);}s[x][1]=merge(s[x][1],y);pushup(x);return x;}else{if(d[y]){pushdown(y);}s[y][0]=merge(x,s[y][0]);pushup(y);return y;} } void split(int i,int k,int &x,int &y) {if(!i){x=y=0;return ;}if(d[i]){pushdown(i);}if(size[s[i][0]]<k){x=i;split(s[i][1],k-size[s[i][0]]-1,s[i][1],y);}else{y=i;split(s[i][0],k,x,s[i][0]);}pushup(i); } void print(int x) {if(!x){return ;}if(d[x]){pushdown(x);}print(s[x][0]);if(flag==0){printf("%d",v[x]);flag=1;}else{printf(" %d",v[x]);}print(s[x][1]); } int main() {srand(12378);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){root=merge(root,build(i));}for(int i=1;i<=m;i++){scanf("%d%d",&L,&R);split(root,L-1,x,y);split(y,R-L+1,y,z);d[y]^=1;root=merge(merge(x,y),z);}print(root);return 0; }

轉載于:https://www.cnblogs.com/Khada-Jhin/p/9090646.html

總結

以上是生活随笔為你收集整理的BZOJ3223文艺平衡树——非旋转treap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。