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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷 P2596 [ZJOI2006]书架 (splay)

發布時間:2024/9/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P2596 [ZJOI2006]书架 (splay) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

小T有一個很大的書柜。這個書柜的構造有些獨特,即書柜里的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。

小T在看書的時候,每次取出一本書,看完后放回書柜然后再拿下一本。由于這些書太有吸引力了,所以她看完后常常會忘記原來是放在書柜的什么位置。不過小T的記憶力是非常好的,所以每次放書的時候至少能夠將那本書放在拿出來時的位置附近,比如說她拿的時候這本書上面有X本書,那么放回去時這本書上面就只可能有X-1、X或X+1本書。

當然也有特殊情況,比如在看書的時候突然電話響了或者有朋友來訪。這時候粗心的小T會隨手把書放在書柜里所有書的最上面或者最下面,然后轉身離開。

久而久之,小T的書柜里的書的順序就會越來越亂,找到特定的編號的書就變得越來越困難。于是她想請你幫她編寫一個圖書管理程序,處理她看書時的一些操作,以及回答她的兩個提問:(1)編號為X的書在書柜的什么位置;(2)從上到下第i本書的編號是多少。

輸入輸出格式

輸入格式:

?

第一行有兩個數n,m,分別表示書的個數以及命令的條數;第二行為n個正整數:第i個數表示初始時從上至下第i個位置放置的書的編號;第三行到m+2行,每行一條命令。命令有5種形式:

1. Top S——表示把編號為S的書放在最上面。

2. Bottom S——表示把編號為S的書放在最下面。

3. Insert S T——T∈{-1,0,1},若編號為S的書上面有X本書,則這條命令表示把這本書放回去后它的上面有X+T本書;

4. Ask S——詢問編號為S的書的上面目前有多少本書。

5. Query S——詢問從上面數起的第S本書的編號。

?

輸出格式:

?

對于每一條Ask或Query語句你應該輸出一行,一個數,代表詢問的答案。

?

輸入輸出樣例

輸入樣例#1:?復制 10 10 1 3 2 7 5 8 10 4 9 6 Query 3 Top 5 Ask 6 Bottom 3 Ask 3 Top 6 Insert 4 -1 Query 5 Query 2 Ask 2 輸出樣例#1:?復制 2 9 9 7 5 3

說明

100%的數據,n,m <= 80000

?

題解:先依次將點插入splay,權值為x[i]的第i個插入,splay維護的是順序

顯然插入到第x+1本或者第x-1本書的操作是將x的權值與他的后繼或者前驅交換

插到底或者頂就是將x的左子樹換到他的后繼的左子樹或者將x的右子樹換到他的前驅的右子樹

然后就可以用splay瞎搞了

?

代碼如下:

#include<set> #include<map> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #define lson ch[x][0] #define rson ch[x][1] #define mod 1000000007 using namespace std;int n,m; int pos[100010],sz[100010],key[100010],f[100010],ch[100010][3],cnt,rt;int push_up(int x) {sz[x]=sz[lson]+sz[rson]+1;pos[key[lson]]=lson;pos[key[rson]]=rson; }int rotate(int x) {int y=f[x],z=f[y],kd=(ch[y][1]==x),xs=ch[x][!kd];if(z) ch[z][ch[z][1]==y]=x;ch[x][!kd]=y;ch[y][kd]=xs;if(xs) f[xs]=y;f[x]=z;f[y]=x;push_up(y); }int splay(int goal,int x) {int y,z;while(f[x]!=goal){y=f[x],z=f[y];if(z!=goal){(ch[y][0]==x)^(ch[z][0]==y)?rotate(x):rotate(y);}rotate(x);}push_up(x);if(!goal) rt=x; }int insert(int x) {key[++cnt]=x;sz[cnt]=1;pos[x]=cnt;ch[cnt][0]=ch[cnt][1]=0;if(cnt>1){ch[cnt-1][1]=cnt;f[cnt]=cnt-1;splay(0,cnt);} }int find(int x,int tot) {if(sz[lson]+1==tot){return x;}else{if(sz[lson]+1<tot){return find(rson,tot-sz[lson]-1);}else return find(lson,tot);} }int get(int x,int kd) {int y=ch[x][kd];while(ch[y][!kd]){y=ch[y][!kd];}return y; }int make_top(int x) {x=pos[x];splay(0,x);if(!lson) return 0;if(!rson) swap(lson,rson);else{int y=get(x,1);f[lson]=y;ch[y][0]=lson;lson=0;splay(0,ch[y][0]);} }int make_buttom(int x) {x=pos[x];splay(0,x);if(!rson) return 0;if(!lson) swap(lson,rson);else{int y=get(x,0);f[rson]=y;ch[y][1]=rson;rson=0;splay(0,ch[y][1]);} }int change(int x,int kd) {if(!kd) return 0;splay(0,pos[x]);int y=(kd==1)?get(pos[x],1):get(pos[x],0);int tmp1=key[y],tmp2=pos[x];swap(pos[x],pos[tmp1]);swap(key[tmp2],key[y]); }void print(int x) {splay(0,x);printf("%d\n",sz[lson]); }void dayin(int x) {printf("%d %d %d\n",x,lson,rson);if(lson) dayin(lson);if(rson) dayin(rson); }int main() {ch[0][0]=ch[0][1]=sz[0]=f[0]=key[0]=pos[0]=0;scanf("%d%d",&n,&m);int tmp;for(int i=1; i<=n; i++){scanf("%d",&tmp);insert(tmp);}string op;while(m--){cin>>op;int tmp1,tmp2;if(op[0]=='T'){scanf("%d",&tmp1);make_top(tmp1);}if(op[0]=='B'){scanf("%d",&tmp2);make_buttom(tmp2);}if(op[0]=='I'){scanf("%d%d",&tmp1,&tmp2);change(tmp1,tmp2);}if(op[0]=='A'){scanf("%d",&tmp1);print(pos[tmp1]);}if(op[0]=='Q'){scanf("%d",&tmp1);printf("%d\n",key[find(rt,tmp1)]);}} }

?

轉載于:https://www.cnblogs.com/stxy-ferryman/p/9588119.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的洛谷 P2596 [ZJOI2006]书架 (splay)的全部內容,希望文章能夠幫你解決所遇到的問題。

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