BZOJ1861 ZJOI2006 書架 題解

2022-05-16 16:15:15 字數 2655 閱讀 1003

(題面複製於洛谷)

小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∈,若編號為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:

299

753

100%的資料,n,m <= 80000

首先我們splay平衡條件為當前元素插入順序,插入順序的關係為lson然後多開乙個陣列pos記錄序號所代表的樹上的位置。

剩下的正常splay就行了。

ps2:top(x)操作基本上是:

1.將xsplay。

2.找到它後面編號的點y,刪掉x,將y作為新的假根節點。

3.將y作為x的右兒子(將x重新新增回來)。

顯然bottom操作和他基本類似。

又顯然ins也類似。

又顯然其他操作很顯然。

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=80001

;inline

intread()

while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}int fa[n],tr[n][2

],key[n],size[n],pos[n];

introot,sz,n,m;

inline

bool

get(int

x)inline

void update(int

x)

return;}

inline

void rotate(int

x)inline

void splay(int

x) root=x;

return;}

inline

void insert(int

v)

return;}

inline

int find(int x,int

v)inline

void top(int

x)

return;}

inline

void bottom(int

x)

return;}

inline

void ins(int x,int

t)inline

int ask(int

x)inline

int query(int

x)inline

char

getc()

intmain()

for(int i=1;i<=m;i++)

if(ch=='

a')printf("

%d\n

",ask(read()));

if(ch=='

q')printf("

%d\n

",query(read()));

}return0;

}

刷題總結 書架(bzoj1861)

小t有乙個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裡的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。小t在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由於這些書太有吸引力了,所以她看完後常常會忘記原來是放在書櫃的什麼位置。不過小t的記憶力是非常好的,所以每次放書的時候至...

BZOJ1003 ZJOI 物流運輸

物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...

ZJOI2007 BZOJ1059 矩陣遊戲

description 第一行包含乙個整數t,表示資料的組數。接下來包含t組資料,每組資料第一行為乙個整數n,表示方陣的大小 接下來n行為乙個n n的01矩陣 0表示白色,1表示黑色 output 輸出檔案應包含t行。對於每一組資料,如果該關卡有解,輸出一行yes 否則輸出一行no。sample i...