日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 福利视频午夜 | 天堂资源在线观看 | 久久久久久久久久网站 | 精品啪啪 | 亚洲一区二区三区在线观看视频 | 亚洲av综合色区无码一二三区 | 欧美一级专区 | 91亚洲国产成人久久精品麻豆 | 一区二区三区四区久久 | 亚洲先锋影音 | 国产靠逼视频 | www.爱爱.com| 成人高潮片免费网站 | 久久精品国产熟女亚洲AV麻豆 | 欧美日韩中出 | 国产主播福利在线 | 国产区一二 | 国产欧美一区二区在线观看 | 亚洲精品少妇一区二区 | 国产一区二区不卡在线 | 四虎影院永久 | а√天堂8资源在线官网 | 欧美性受xxxx黑人xyx | 欧美成人精品在线 | 69色堂 | 久久系列 | 精品一区二区三区国产 | 午夜偷拍福利视频 | 国产美女主播在线观看 | 中文字幕第三页 | 97国产精品人人爽人人做 | 国产日日操 | 人禽l交视频在线播放 视频 | 欧美日韩一区二区视频观看 | 美女裸体跪姿扒开屁股无内裤 | 欧美一区二区三区四区在线观看 | 一区二区三区伦理片 | 精品国产免费视频 | 国产精成人 | 久久精品国产熟女亚洲AV麻豆 | 日本一区二区视频 | 澳门三级| 天天干天天干天天干 | www.呦呦 | 欧美中文在线观看 | 欧美特黄aaaaaa | 玖玖视频国产 | 吖v在线| 亚洲成年人在线观看 | 中文字幕一区二区三区人妻不卡 | 久久久亚洲国产 | 亚洲大片免费 | 欧美bdsm调教视频 | 67194在线免费观看 | 樱花草涩涩www在线播放 | 成人在线播放视频 | 手机看片福利在线 | 欧美在线视频网 | 在线观看黄色 | 99在线观看视频 | 少妇太紧太爽又黄又硬又爽小说 | 岛国精品一区二区 | 肉肉av福利一精品导航 | 人人玩人人弄 | 亚洲色诱 | 欧美激情aaa | 日韩人妻一区 | 台湾佬美性中文娱乐网 | 在线日韩 | 一区二区三区在线免费观看 | 亚洲免费国产视频 | 国产高潮呻吟久久 | 黄色片免费视频 | 国产白袜脚足j棉袜在线观看 | 九色91| 91久久精品一区二区 | 色八区 | 国产精品永久在线观看 | 三浦惠理子aⅴ一二三区 | 日本特级黄色 | 国产一区精品久久 | 国产av无码专区亚洲精品 | 啪啪网站免费看 | 久久精品欧美一区二区 | 国产精品水嫩水嫩 | 国产综合久久久久久鬼色 | 日韩欧av| 精品人妻一区二区三区视频 | 久久国产加勒比精品无码 | 国产高清亚洲 | 视频一区欧美 | аⅴ资源天堂资源库在线 | 亚洲成人自拍网 | 四虎免费观看 | 久久久久久久久久久久久女过产乱 | 国产真实的和子乱拍在线观看 | 淫妹妹影院 | 咪咪色影院 | 涩涩综合 |