code vs 1743 反轉卡片(splay)

2021-07-11 18:15:10 字數 1559 閱讀 7254

時間限制: 2 s

空間限制: 256000 kb

題目等級 : 大師 master

題解

檢視執行結果

【dzy493941464|yywyzdzr原創】 

小a將n張卡片整齊地排成一排,其中每張卡片上寫了1~n的乙個整數,每張卡片上的數各不相同。

比如下圖是n=5的一種情況:3 4 2 1 5

接下來你需要按小a的要求反轉卡片,使得左數第一張卡片上的數字是1。操作方法:令左數第一張卡片上的數是k,如果k=1則停止操作,否則將左數第1~k張卡片反轉。

第一次(k=3)反轉後得到:2 4 3 1 5

第二次(k=2)反轉後得到:4 2 3 1 5

第三次(k=4)反轉後得到:1 3 2 4 5

可見反轉3次後,左數第一張卡片上的數變成了1,操作停止。

你的任務是,對於一種排列情況,計算要反轉的次數。你可以假設小a不會讓你操作超過100000次。

輸入描述 input description

第1行乙個整數n;

第2行n個整數,為1~n的乙個全排列。

輸出描述 output description

僅1行,輸出乙個整數表示要操作的次數。

如果經過有限次操作仍無法滿足要求,輸出-1。

樣例輸入 sample input

53 4 2 1 5

樣例輸出 sample output

3 資料範圍及提示 data size & hint

0分類標籤 tags 點此展開 

#include#include#include#include#include#define n 3000011

using namespace std;

int ch[n][2],fa[n],key[n],size[n],a[n],root;

int rev[n],sz,n;

void update(int x)

int get(int x)

void pushdown(int x)

void rotate(int x)

void splay(int x,int tar)

int find(int x) }}

int build(int l,int r)

int now=++sz; int mid=(l+r)/2;

ch[now][0]=build(l,mid-1); ch[now][1]=build(mid+1,r);

fa[ch[now][0]]=now; fa[ch[now][1]]=now;

size[now]=size[ch[now][0]]+size[ch[now][1]]+1;

key[now]=a[mid];

return now;

}int main()

int aa=find(1); int bb=find(t+2);

splay(aa,0); splay(bb,aa);

rev[ch[ch[root][1]][0]]^=1;

} printf("-1\n");

}

codevs1743 反轉卡片

1743 反轉卡片 時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解題目描述 description dzy493941464 yywyzdzr原創 小a將n張卡片整齊地排成一排,其中每張卡片上寫了1 n的乙個整數,每張卡片上的數各不相同。比如下圖是n 5的一種情況...

codevs1743 反轉卡片

題目鏈結 給出乙個序列,要求維護這樣一種操作 將前a1個數反轉,若第a1等於1,則停止操作。像這種帶有反轉區間的操作,大概就是splay了。碼了乙個晚上。splay一般就是處理區間反轉,區間插入,區間刪除這三種線段樹等資料結構無法處理的操作,splay難寫又難調,經常犯一些鬼畜錯誤,能不寫就盡量不寫...

Codevs 1743 反轉卡片 splay

1743 反轉卡片 時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題目描述 description dzy493941464 yywyzdzr原創 小a將n張卡片整齊地排成一排,其中每張卡片上寫了1 n的乙個整數,每張卡片上的數各不相同。比如下圖是n 5的一種情況 3...