1743 反轉卡片時間限制:2 s
空間限制: 256000 kb
題目等級 :大師 master
題目描述 description
【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
5 3 4 2 1 5
樣例輸出 sample output
3 資料範圍及提示 data size & hint
0
/*
splay 區間翻轉.
中間腦抽了一下不過還好~
查詢rank的時候查當前位置是誰.
小細節:不能用0節點所以都往右平移一位.
*/#include
#include
#define maxn 300010
#define inf 1e9
using
namespace
std;
int n,t1,t2,tot,root,ans,size[maxn],id[maxn],s[maxn],fa[maxn],tree[maxn][2],rev[maxn];
int read()
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}void push(int x)
void rotate(int x,int &k)
fa[y]=x,fa[x]=z,fa[tree[x][r]]=y;
tree[y][l]=tree[x][r];tree[x][r]=y;
size[y]=size[tree[y][0]]+size[tree[y][1]]+1;
size[x]=size[tree[x][0]]+size[tree[x][1]]+1;
return ;
}void splay(int x,int &k)
rotate(x,k);
}return ;
}void add(int &k,int f,int x,int y)
if(x<=id[k]) add(tree[k][0],k,x,y);
else add(tree[k][1],k,x,y);
return ;
}int query(int x,int k)
void slove()
return ;
}int main()
codevs1743 反轉卡片
1743 反轉卡片 時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解題目描述 description dzy493941464 yywyzdzr原創 小a將n張卡片整齊地排成一排,其中每張卡片上寫了1 n的乙個整數,每張卡片上的數各不相同。比如下圖是n 5的一種情況...
codevs1743 反轉卡片
題目鏈結 給出乙個序列,要求維護這樣一種操作 將前a1個數反轉,若第a1等於1,則停止操作。像這種帶有反轉區間的操作,大概就是splay了。碼了乙個晚上。splay一般就是處理區間反轉,區間插入,區間刪除這三種線段樹等資料結構無法處理的操作,splay難寫又難調,經常犯一些鬼畜錯誤,能不寫就盡量不寫...
code vs 1743 反轉卡片(splay)
時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解 檢視執行結果 dzy493941464 yywyzdzr原創 小a將n張卡片整齊地排成一排,其中每張卡片上寫了1 n的乙個整數,每張卡片上的數各不相同。比如下圖是n 5的一種情況 3 4 2 1 5 接下來你需要按小...