題解 BZOJ 3223 文藝平衡樹

2021-08-14 09:30:22 字數 1584 閱讀 4986

題目描述 description

翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2,4]的話,結果是5 2 3 4 1

最開始所有元素都是0。

輸入描述 input description

第一行為n,m

n表示初始序列有n個數,這個序列依次是(1,2……n-1,n)

m表示翻轉操作次數

接下來m行每行兩個數[l,r] 資料保證 1≤l≤r≤n

輸出描述 output description

輸出一行n個數字,表示原始序列經過m次變換後的結果

樣例輸入 sample input

5 3

1 3

1 3

1 4樣例輸出 sample output

4 3 2 1 5

資料範圍及提示 data size & hint

n,m≤100000

分析:

這個題目要求我們進行旋轉操作,怎麼辦呢?

模擬肯定超時~放棄

題目不是給了你提示麼–平衡樹

那麼我們用splay來維護這個序列

因為splay滿足二叉搜尋樹的性質,那麼如果把每個點的左右兒子交換,那麼這些點的中序遍歷就翻轉了

於是將l-1和r+1號節點分別提至根節點和根節點的右兒子,那麼要操作的序列就是r+1號節點的左兒子,直接給它打上乙個翻轉標記,等到下次遇到這個點是就下傳標記並且翻轉左右子樹即可(像不像線段樹lazy_tag?)

code:

#include 

using

namespace

std;

#define inf 2100000000

#define maxn 100010

int ch[maxn][2],f[maxn],size[maxn],key[maxn],lazy[maxn];

int sz,root;

int read()

bool get(int x)

void update(int x)

return ;

}void pushdown(int x)

return ;

}void rotate(int x)

void splay(int x,int tar)

int findx(int x)

}}void insert(int x)

int now=root,fa=0;

while(1)

fa=now;

now=ch[now][key[now]if(now==0)

}return ;

}void print(int x)

int main()

print(root);

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 文藝平衡樹

題意 對於乙個1 n的序列。進行m次區間反轉操作 求最後反轉過的區間。n,m 100000。題解 splay躶題。寫完維修數列之後感覺這種題都好寫了。反轉啥的打個標記下傳就好,記得輸出時再pushdown標記就好了 這篇題解就是說一下單旋和雙旋的簡單差別 爺爺結點就是目標的情況不討論了 zig za...