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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ-3580-SuperMemo(splay的各种操作)

發布時間:2023/12/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ-3580-SuperMemo(splay的各种操作) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:對數組進行各種操作

其中?REVOLVE右移操作。將區間[a,b]右移c位

首先c可能比較多,可以先對區間長度取模。

在右移之后,可以發現[a,b]被分為兩個區間[a,b-c] ?[b-c+1,b],將后者插入到前者之前即可。

?

// File Name: ACM/POJ/3580.cpp // Author: Zlbing // Created Time: 2013年08月10日 星期六 10時51分07秒 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3fffffff #define LL long long #define REP(i,r,n) for(int i=r;i<=n;i++) #define RREP(i,n,r) for(int i=n;i>=r;i--) #define L ch[x][0] #define R ch[x][1] #define KT (ch[ ch[rt][1] ][0]) const int MAXN = 2e5+100; int num[MAXN]; struct SplayTree {int sz[MAXN];int ch[MAXN][2];int pre[MAXN];int rt,top;inline void down(int x){if(flip[x]) {flip[ L ] ^= 1;flip[ R ] ^= 1;swap(L,R);flip[x]=0;}if(add[x]){if(L){add[L]+=add[x];mi[L]+=add[x];val[L]+=add[x];}if(R){add[R]+=add[x];mi[R]+=add[x];val[R]+=add[x];}add[x]=0;}}inline void up(int x){sz[x]=1+sz[ L ] + sz[ R ];mi[x]=min(val[x],min(mi[L],mi[R]));}inline void Rotate(int x,int f){int y=pre[x];down(y);down(x);ch[y][!f] = ch[x][f];pre[ ch[x][f] ] = y;pre[x] = pre[y];if(pre[x]) ch[ pre[y] ][ ch[pre[y]][1] == y ] =x;ch[x][f] = y;pre[y] = x;up(y);}inline void Splay(int x,int goal){//將x旋轉到goal的下面down(x);////防止pre[x]就是目標點,下面的循環就進不去了,x的信息就傳不下去了while(pre[x] != goal){down(pre[pre[x]]); down(pre[x]);down(x);//在旋轉之前需要先下傳標記,因為節點的位置可能會發生改變if(pre[pre[x]] == goal) Rotate(x , ch[pre[x]][0] == x);else {int y=pre[x],z=pre[y];int f = (ch[z][0]==y);if(ch[y][f] == x) Rotate(x,!f),Rotate(x,f);else Rotate(y,f),Rotate(x,f);}}up(x);if(goal==0) rt=x;}inline void RTO(int k,int goal){//將第k位數旋轉到goal的下面int x=rt;down(x);while(sz[ L ]+1 != k) {if(k < sz[ L ] + 1 ) x=L;else {k-=(sz[ L ]+1);x = R;}down(x);}Splay(x,goal);}void vist(int x){if(x){printf("結點%2d : 左兒子 %2d 右兒子 %2d %2d flip:%d\n",x,L,R,val[x],flip[x]);printf("結點%2d mi=%2d\n",x,mi[x]);vist(L);vist(R);}}void Newnode(int &x,int c,int f){x=++top;flip[x]=0;L = R = 0; pre[x] = f;sz[x]=1; val[x]=c;mi[x]=c; add[x]=0;}inline void build(int &x,int l,int r,int f){if(l>r) return ;int m=(l+r)>>1;Newnode(x,num[m],f);build(L , l , m-1 , x);build(R , m+1 , r , x);pre[x]=f;up(x);}//終于明白初始化結點0的用處了。就是所有的葉子結點,是終止結點inline void init(int n){ch[0][0]=ch[0][1]=pre[0]=sz[0]=0;rt=top=0; flip[0]=0; val[0]=0;add[0]=0;mi[0]=INF;Newnode(rt,INF,0);Newnode(ch[rt][1],INF,rt);sz[rt]=2;build(KT,1,n,ch[rt][1]);up(ch[rt][1]);up(rt);}void Del(){int t=rt;if(ch[rt][1]) {rt=ch[rt][1];RTO(1,0);ch[rt][0]=ch[t][0];if(ch[rt][0]) pre[ch[rt][0]]=rt;}else rt=ch[rt][0];pre[rt]=0;up(rt);}void ADD(int a,int b,int d){if(a>b)swap(a,b);RTO(a,0);RTO(b+2,rt);add[KT]+=d;val[KT]+=d;mi[KT]+=d;}void REVERSE(int a,int b){if(a>b)swap(a,b);RTO(a,0);RTO(b+2,rt);flip[KT]^=1;}//t有可能為負void REVOLVE(int x,int y,int t){if(x>y)swap(x,y);t=t%(y-x+1);t=(t+y-x+1)%(y-x+1);if(t==0)return;int l=y-t+1;int r=y+2;RTO(l,0);RTO(r,rt);int tmp=KT;KT=0;up(ch[rt][1]);up(rt);RTO(x,0);RTO(x+1,rt);KT=tmp;pre[tmp]=ch[rt][1];up(ch[rt][1]);up(rt);}void INSERT(int x,int p){RTO(x+1,0);RTO(x+2,rt);Newnode(KT,p,ch[rt][1]);up(ch[rt][1]);up(rt);}void DELETE(int x){RTO(x,0);RTO(x+2,rt);KT=0;up(ch[rt][1]);up(rt);}int MIN(int x,int y){if(x>y)swap(x,y);RTO(x,0);RTO(y+2,rt);return mi[KT];}int flip[MAXN];int val[MAXN];int mi[MAXN];int add[MAXN]; }spt;int main() {int n,m;while(~scanf("%d",&n)){REP(i,1,n)scanf("%d",&num[i]);scanf("%d",&m);spt.init(n);char op[10];int a,b,c;REP(i,1,m){scanf("%s",op);if(op[0]=='A'){scanf("%d%d%d",&a,&b,&c);spt.ADD(a,b,c);}else if(op[0]=='I'){scanf("%d%d",&a,&b);spt.INSERT(a,b);}else if(op[0]=='D'){scanf("%d",&a);spt.DELETE(a);}else if(op[0]=='M'){scanf("%d%d",&a,&b);int ans=spt.MIN(a,b);printf("%d\n",ans);}else if(strcmp(op,"REVERSE")==0){scanf("%d%d",&a,&b);spt.REVERSE(a,b);}else if(strcmp(op,"REVOLVE")==0){scanf("%d%d%d",&a,&b,&c);spt.REVOLVE(a,b,c);}}}return 0; }

?

轉載于:https://www.cnblogs.com/arbitrary/p/3252862.html

總結

以上是生活随笔為你收集整理的POJ-3580-SuperMemo(splay的各种操作)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 一本久久a精品一合区久久久 | 人妻无码一区二区三区久久99 | 久久亚洲精品小早川怜子 | 青青草原成人网 | 天天干夜夜看 | 亚洲高清色 | 婷婷亚洲综合 | 欧美精品做受xxx性少妇 | 青青草成人av | www.x日本 | 懂色av一区二区三区四区五区 | 99久久久无码国产精品免费蜜柚 | 中文字幕在线播放不卡 | 国产精品欧美久久久久天天影视 | 亚洲欧洲国产视频 | 婷婷国产成人精品视频 | 蜜臀久久99精品久久久久宅男 | 超色视频 | 亚欧成人在线 | 扒开腿揉捏花蒂h | 啪啪免费视频网站 | 成人片在线视频 | 亚洲色图激情 | 俺也去婷婷 | 欧美片一区二区三区 | 国产精品三级久久久久久电影 | 伊人国产女 | 亚洲丁香| 中文字幕日韩无 | 久久综合一本 | 男人的天堂一级片 | 涩涩视频在线免费看 | 亚洲校园激情 | 国产卡一卡二 | 最近的中文字幕 | 91精品国产高潮对白 | 在线观看一区视频 | 日韩精品中文字幕在线 | 天天免费看av | 国产激情在线视频 | 在线观看黄网址 | 午夜国产福利 | 91看片淫黄大片91桃色 | 特黄aaaaaaaaa真人毛片 | 午夜精品福利一区二区 | 狂野欧美性猛交xxxx | 日日操天天操 | 久草aⅴ| 亚洲精品五月 | 色香色香欲天天天影视综合网 | 无码国产精品一区二区高潮 | 日韩毛片一区 | 精品国产18久久久久久二百 | 深夜福利影院 | 亚洲一区观看 | 中文字幕一区二区三区乱码人妻 | 人人爱人人搞 | 久久99国产精品久久99果冻传媒 | 最新91在线| 玖玖爱在线精品视频 | 国产一级自拍视频 | 美女三级黄色片 | 天天影视插插插 | 一边摸内裤一边吻胸 | 日韩极品视频在线观看 | 欧美日韩tv | 亚洲制服丝袜在线播放 | 黄久久久 | 亚洲小说在线 | 一级性生活黄色片 | av网站亚洲 | 香蕉久热| ,一级淫片a看免费 | 婷婷色中文 | 日日撸夜夜操 | 欧美成人免费播放 | 亚洲人成色777777老人头 | 亚洲精品欧美在线 | 亚洲最新av在线 | 鲁丝一区二区三区 | 中文字幕成人在线视频 | 91久久精品夜夜躁日日躁欧美 | 日韩欧美自拍偷拍 | 午夜一二三区 | 夜夜se| 精品久久毛片 | 国产又好看的毛片 | 很黄很污的视频 | 娇小的粉嫩xxx极品 国产精品人人爽人人爽 | 欧美大黄视频 | 福利社午夜影院 | 波多野结衣一区二区 | 综合在线一区 | 国产精品视频网站 | 一级黄色免费视频 | 国产秋霞 | 99热手机在线观看 | 在线一区二区三区 | 男女爱爱网站 |