題意:
對於乙個1~n的序列。進行m次區間反轉操作;
求最後反轉過的區間。
n,m<=100000。
題解:
splay躶題。寫完維修數列之後感覺這種題都好寫了。
反轉啥的打個標記下傳就好,記得輸出時再pushdown標記就好了;
這篇題解就是說一下單旋和雙旋的簡單差別;
爺爺結點就是目標的情況不討論了;
zig-zag實際上雙旋與單旋的操作是一樣的:
不同的是zig-zig操作:
依據某些奇妙的勢能分析(鏈結),雙旋大概比單旋快一些的;
(而且敢寫單旋你不怕被各路神犇d嗎)
可是經過我的幾個小測試,其它函式一樣。僅改變單旋雙旋,時間並沒有太多區別;
下面上為單旋下為雙旋;
我就寫了這麼幾道題,可是應該能夠發現,不管單雙都是能夠ac的。
而且僅僅有1588似乎有卡單旋的資料,所以單旋黨的猖獗也不是沒有道理嘛;
所以單旋雙旋對於吾等蒟蒻是隨便的的啦= =;
回歸正題。
。。發一下3223的**吧。
**:
#include#include#include#define n 110001
#define which(x) (ch[fa[x]][1]==x)
using namespace std;
int fa[n],ch[n][2],val[n],size[n],root,tot;
bool flag[n];
void pushup(int x)
void pushdown(int x)
}void rotate(int x)
/* 單旋spaly
void splay(int x,int g)
if(!g) root=x;}*/
void splay(int x,int g)//雙旋splay
if(which(x)^which(f))
rotate(x);
else
rotate(f);
rotate(x);
} if(!g) root=x;
}int rank(int x,int k)
int build(int l,int r,int f)
void update(int l,int r)
void print(int x)
int main()
splay(rank(root,1),0);
splay(rank(root,n+2),root);
print(ch[ch[root][1]][0]);
return 0;
}
BZOJ 3223 文藝平衡樹
您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 n,m 100000 splay拿來練翻轉 這題就只用支援翻轉,很裸 翻轉區間 x,y 的操作 提取該區間,打乙個bo...
bzoj3223 文藝平衡樹
bzoj3223 文藝平衡樹 description 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 input 第一行為n,m n表示初始序列有n個數,這個序列依次...
bzoj 3223 文藝平衡樹
題目大意 維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 思路 splay 區間操作 棒神 1 include2 include3 include4 include5 include6 include7 i...