bzoj 3223 文藝平衡樹

2021-09-08 13:00:58 字數 1622 閱讀 2718

題意:

對於乙個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...