BZOJ 3223 文藝平衡樹

2021-07-23 17:22:29 字數 1011 閱讀 2041

您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列,其中需要提供以下操作:翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2,4]的話,結果是5 2 3 4 1

n,m<=100000

splay拿來練翻轉

這題就只用支援翻轉,很裸

翻轉區間[x,y]的操作:

提取該區間,打乙個bool型別的lazy tag,值為1表示該區間要翻轉。

翻轉兩次乙個區間相當於不翻轉,因此打標記的**是bz[x]=bz[x] xor 1

當以後做的時候走到這個點,就要先down一下標記,具體過程是交換其兩個子樹,標記下傳,該點標記清空。

也就是線段樹lazy tag的思想。當然提取區間需要維護size,需要查詢區間第k個元素

注意,因為有區間翻轉操作,所以kth的時候要下傳標記,要不然會找錯。

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

const

int n=100010;

int n,m,top,root,t[n][2],f[n],size[n];

bool bz[n];

bool pd(int x)

void update(int x)

void down(int x)

void rotate(int x)

void splay(int x,int y)

update(x);

if(!y) root=x;

}int kth(int x,int k)

void turn(int l,int r)

int main()

fo(i,2,n+1) printf("%d ",kth(root,i)-1);

return0;}



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...

bzoj 3223 文藝平衡樹

題目大意 維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 思路 splay 區間操作 棒神 1 include2 include3 include4 include5 include6 include7 i...