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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[poj3580]SuperMemo(splay终结题)

發(fā)布時間:2023/12/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [poj3580]SuperMemo(splay终结题) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳送門


題意:
你需要維護一組數(shù)字,包括這樣的幾個操作:
給出一個數(shù)字序列,有6種操作:
1、 ADD l r d:區(qū)間[l,r]的數(shù)都加上d。
2、 REVERSE l r : 將區(qū)間[l,r]中的數(shù)翻轉(zhuǎn) 。
3、 REVOLVE l r t :將區(qū)間[l,r]旋轉(zhuǎn)t次,如1 2 3 4 5 旋轉(zhuǎn)2次后就變成4 5 1 2 3 。
4、 INSERT p x :在第p個數(shù)后面插入x 。
5、DELETE p :刪除第p個數(shù) 。
6、 MIN l r : 查詢區(qū)間[x,y]中的最小值 。


一道不錯的splay練手題。
首先用類似線段樹的中序遍歷建樹保證二叉搜索樹性質(zhì)。

對于所有的區(qū)間[l,r]操作,可以把l-1旋轉(zhuǎn)到根,r+1旋轉(zhuǎn)到l-1的下面,那么由于二叉搜索樹的性質(zhì),這時候r+1的左子樹就是[l,r]區(qū)間。

那么對于區(qū)間加法,我們需要維護一個lazy的加法標(biāo)記,在旋轉(zhuǎn)的時候Pushdown傳遞標(biāo)記給左右孩子(與線段樹相同),對于區(qū)間翻轉(zhuǎn),由于二叉搜索樹的性質(zhì),我們在翻轉(zhuǎn)某一棵樹的時候只要把他所有的子樹的左右孩子翻轉(zhuǎn)一下就好了,那么一樣維護一個lazy的旋轉(zhuǎn)標(biāo)記即可。

對于在p后插入x,我們模仿區(qū)間操作的方法,把p和p+1之間的空間“撐”開來。也就是說把p翻轉(zhuǎn)到根,把p+1旋轉(zhuǎn)到p的下面,那么p+1的左子樹就空出來了,就可以將新節(jié)點插入進去。

對于刪除p,我們同樣把p-1旋轉(zhuǎn)到根,把p+1旋轉(zhuǎn)到p-1的下面,那么p+1的左子樹就是p,直接刪掉即可,空間蠻大的這時候最好回收空間。

區(qū)間最小值很簡單,我們維護一個最小值mn,在Pushup的時候和子樹大小size一起被左右孩子更新即可。

接下來剩下的操作就是這題的特殊操作,區(qū)間旋轉(zhuǎn),我們不難發(fā)現(xiàn),因為旋轉(zhuǎn)[l,r]區(qū)間t次是往后面推t個數(shù)然后放到前面,所以區(qū)旋轉(zhuǎn)實際上是交換兩個區(qū)間。那么我們把旋轉(zhuǎn)[l,r]區(qū)間t次可以看做交換[l,r-t]和[r-t+1,r],具體的操作也是區(qū)間操作,先把后面被推出去的那段拿出來,放到前面即可。

注意,對于任何涉及區(qū)間操作的題目都要設(shè)置哨兵節(jié)點。


#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; const int N=1e5+10; const int INF=2147483647; inline int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; }struct splay {int d,f,size,son[2];int fz,mn,add; }tr[N*2]; int tot,root,n; void newnode(int x,int d,int f)//新建節(jié)點,東西比較多就單放出來了 {tr[x].f=f; tr[x].d=tr[x].mn=d;tr[x].size=1; tr[x].fz=tr[x].add=0;tr[x].son[0]=tr[x].son[1]=0; } void delnode(int x)//刪除節(jié)點 {tr[x].f=tr[x].d=tr[x].size=tr[x].mn=0;tr[x].son[0]=tr[x].son[1]=tr[x].fz=tr[x].add=0; } void update_add(int x,int d)//執(zhí)行加 {if(!x) return ;tr[x].add+=d; tr[x].d+=d; tr[x].mn+=d; } void update_fz(int x)//執(zhí)行翻轉(zhuǎn) {if(!x) return;swap(tr[x].son[0],tr[x].son[1]);tr[x].fz^=1; } void pushup(int x)//向上更新size,min {if(!x) return ;int lc=tr[x].son[0],rc=tr[x].son[1];tr[x].size=1; tr[x].mn=tr[x].d;if(lc) tr[x].size+=tr[lc].size,tr[x].mn=min(tr[x].mn,tr[lc].mn);if(rc) tr[x].size+=tr[rc].size,tr[x].mn=min(tr[x].mn,tr[rc].mn); } void pushdown(int x)//lazy:更新下方add,fz {if(!x) return;if(tr[x].add){update_add(tr[x].son[0],tr[x].add);update_add(tr[x].son[1],tr[x].add);tr[x].add=0;}if(tr[x].fz){update_fz(tr[x].son[0]);update_fz(tr[x].son[1]);tr[x].fz=0; } } void rotate(int x,int w) {int f=tr[x].f,ff=tr[f].f;int r,R;pushdown(f); pushdown(x);r=tr[x].son[w],R=f;tr[R].son[1-w]=r;if(r!=0) tr[r].f=R;r=x,R=ff;if(tr[ff].son[0]==f) tr[R].son[0]=r;else tr[R].son[1]=r;tr[r].f=R;r=f,R=x;tr[R].son[w]=r;tr[r].f=R;pushup(f);pushup(x); }void splay(int x,int rt) {pushdown(x);while(tr[x].f!=rt){int f=tr[x].f,ff=tr[f].f;pushdown(ff),pushdown(f),pushdown(x);if(ff==rt){if(tr[f].son[0]==x) rotate(x,1);else rotate(x,0);}else {if(tr[ff].son[0]==f && tr[f].son[0]==x) rotate(f,1),rotate(x,1);else if(tr[ff].son[1]==f && tr[f].son[1]==x) rotate(f,0),rotate(x,0);else if(tr[ff].son[0]==f && tr[f].son[1]==x) rotate(x,0),rotate(x,1);else if(tr[ff].son[1]==f && tr[f].son[0]==x) rotate(x,1),rotate(x,0);//三點一線的情況不能單旋否則復(fù)雜度退化 }}pushup(x);if(rt==0) root=x; } int a[N]; void build(int &x,int l,int r,int f) { //中序遍歷建樹保證平衡 if(l>r) return;int mid=(l+r)/2;x=mid; newnode(x,a[x],f);build(tr[x].son[0],l,mid-1,x);build(tr[x].son[1],mid+1,r,x);pushup(x); }int find_kth(int x,int k) {pushdown(x);if(tr[tr[x].son[0]].size+1 == k) return x;else if(tr[tr[x].son[0]].size >= k) return find_kth(tr[x].son[0],k);else return find_kth(tr[x].son[1], k-tr[tr[x].son[0]].size-1); }//--------- void add(int l,int r,int d) //[l~r]加d {int x=find_kth(root,l-1),y=find_kth(root,r+1);splay(x,0); splay(y,x);update_add(tr[y].son[0],d); } void ins(int p,int x)//p后面插入x {int y=find_kth(root,p),z=find_kth(root,p+1);splay(y,0); splay(z,y);newnode(++tot,x,z); tr[z].son[0]=tot;for(int i=z;i;i=tr[i].f) pushdown(i),pushup(i);splay(z,0); } void del(int p)//刪除p {int x=find_kth(root,p-1),y=find_kth(root,p+1);splay(x,0); splay(y,x);delnode(tr[y].son[0]); tr[y].son[0]=0;pushup(y); pushup(x); } int get_min(int l,int r)//[l,r]間最小值 {int x=find_kth(root,l-1),y=find_kth(root,r+1);splay(x,0); splay(y,x);return tr[tr[y].son[0]].mn; } void rev(int l,int r)//翻轉(zhuǎn)[l,r] {int x=find_kth(root,l-1),y=find_kth(root,r+1);splay(x,0); splay(y,x);update_fz(tr[y].son[0]); } void exchange(int l1,int r1,int l2,int r2)//區(qū)間[l1,r1],[l2,r2]交換 {int x=find_kth(root,l2-1),y=find_kth(root,r2+1);splay(x,0); splay(y,x); //導(dǎo)出區(qū)間int tmp=tr[y].son[0]; tr[y].son[0]=0; //剪貼 x=find_kth(root,l1-1),y=find_kth(root,l1);splay(x,0); splay(y,x);tr[y].son[0]=tmp;tr[tmp].f=y; } //---char ss[10]; int main() {scanf("%d",&n);a[1]=a[n+1]=INF;//設(shè)立哨兵節(jié)點 for(int i=2;i<=n+1;i++) scanf("%d",&a[i]);tot=n+2; root=0;tr[0].f=tr[0].size=tr[0].son[0]=tr[0].son[1]=tr[0].add=tr[0].fz=0; tr[0].d=INF; build(root,1,n+2,0);pushup(root);int m;scanf("%d",&m);int l,r,d; while(m--)//由于有哨兵節(jié)點后面的位置都要+1 {scanf("%s",ss);if(ss[0]=='A'){l=read(),r=read(),d=read();add(l+1,r+1,d);}else if(ss[0]=='I'){l=read(),d=read();ins(l+1,d); }else if(ss[0]=='D'){d=read();del(d+1); }else if(ss[0]=='M'){l=read(),r=read();printf("%d\n",get_min(l+1,r+1)); }else if(ss[0]=='R' && ss[3]=='E'){l=read(),r=read();rev(l+1,r+1); }else if(ss[0]=='R' && ss[3]=='O'){l=read(),r=read(),d=read();d%=(r-l+1);if(d) exchange(l+1,r-d+1,r-d+1+1,r+1); }}return 0; }

總結(jié)

以上是生活随笔為你收集整理的[poj3580]SuperMemo(splay终结题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 九九久久精品 | 久久久久在线视频 | 国产精品无码一区二区三 | 久久久久99精品国产片 | 中文字幕乱码亚洲精品一区 | 国产一区二区激情 | 超级乱淫视频 | 亲嘴脱内衣内裤 | 亚洲国产精品成人综合久久久 | 国产一在线| 96日本xxxxxⅹxxx17 | 欧美xxxxx少妇 | 理论片高清免费理伦片 | 黄色一区二区三区四区 | 激情国产一区 | 中国性老太hd大全69 | 男生插女生视频在线观看 | 91网站在线免费看 | 一级理论片 | 尤物av在线 | 芒果视频污污 | 国语精品久久 | 天堂8在线视频 | 在线一区二区视频 | 欧美日韩中文在线 | 337p嫩模大胆色肉噜噜噜 | xxxⅹ少妇少妇xxxx | 日批网站在线观看 | 精品蜜桃一区二区三区 | 日韩av中文在线 | www.在线视频 | 欧美日韩一区二区三区在线 | 字幕网av | 日本免费黄色网 | 日韩精品一区二区亚洲av观看 | 色狠狠一区二区 | www在线观看免费视频 | 亚洲成人伦理 | 日本激情一区二区三区 | 欧美三级一级片 | 成人国产精品一区 | 操操日日 | 日本猛少妇色xxxxx猛叫 | 午夜欧美视频 | 中文字幕乱码视频 | 日本色www | 青娱乐国产在线 | 色婷婷av一区二区三区四区 | 亚洲精品一区三区三区在线观看 | 娇妻被老王脔到高潮失禁视频 | 精品国产乱码久久 | 动漫美女被x | 成人福利视频在线 | 婷婷久久伊人 | 亚洲一级视频在线观看 | 韩国电影大尺度在线观看 | 一区二区在线视频播放 | 国产成人一区二区三区小说 | 黄色片18 | 欧美成免费 | 激情久久av一区av二区av三区 | 国产成人一区二区三区免费看 | 亚洲天堂999 | 亚洲αv| 国产精品久久久久久久专区 | 久久精品电影网 | 拍国产真实乱人偷精品 | 69国产精品视频 | 最新日韩在线视频 | 天天鲁一鲁摸一摸爽一爽 | 国产毛片欧美毛片久久久 | 无码播放一区二区三区 | 日本伦理一区二区 | 亚洲制服丝袜av | 国产一区麻豆 | 可以免费看的av网站 | 国产亚洲精品女人久久久久久 | 免费看一区二区三区 | 荫道bbwbbb高潮潮喷 | 国产主播福利在线 | 欧美精品一区三区 | 午夜久久久| 在线观看久 | 爱露出| 亚洲一区二区三区麻豆 | 色多多av| 国产对白刺激视频 | 91网站免费观看 | 国产精品一区二区无码免费看片 | 日本精品久久久久中文字幕 | 欧美精品福利 | 在线观看国产三级 | 精品国产露脸精彩对白 | 久久露脸国语精品国产 | 一道本不卡视频 | 欧美日韩999 | 日韩欧美极品 | 精品国模一区二区三区 | 日韩精品一区在线观看 |