P3391 模板 文藝平衡樹 (無旋treap)

2021-09-29 11:52:32 字數 1045 閱讀 6863

用可以提取區間的平衡樹,對區間整體打標記,先不下放,等到操作涉及這個節點時再下放:交換左右兒子並給左右兒子打標記

我用的是無旋treap

剛開始需要建樹,建樹模仿笛卡爾樹,由於所有元素出棧之後自身的兒子不會再有變化,因此出棧的時候再push_up即可,由於棧維護右鏈,棧頂就是root

要看splay版本的也可以去這裡看》splay版本文藝平衡樹(在部落格比較靠下的位置)

/*

1.因為維護正確順序,因此中序遍歷需要得到原陣列,所以插入的時候下標越小數越小

2.之後就是選取區間操作,已經在樹中就沒有大小之分,只有順序,此時只能按照個數**

3.pushup操作在build函式中:出棧元素,構建完之後的棧內元素

4.下放標記有點拎不清,標記了就可以,等到需要下放再交換,注意本質的東西,當前資訊對的情況下能懶則懶,不需要交換子節點就等到需要下放的時候再交換

*/#includeusing namespace std;

#define ll long long

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

#define for0(i,a,b) for (int i=a;i=0 && pri[i]=0) ch[sta[tot]][1] = i;

sta[++tot] = i;

}while (tot>=0) push_up(sta[tot--]);

root = sta[0];

}void split(int rt,int k,int &x,int &y)

else

push_up(rt);}}

int merge(int x,int y)

else }}

void reverse(int l,int r)

bool flag;

void dfs()

void dfs(int now)

}ftp;

int main()

ftp.dfs();

return 0;

}

P3391 模板 文藝平衡樹

題目鏈結 題目描述 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列。其中需要提供以下操作 翻轉乙個區間,例如原有序序列是 543 215 4 3 2 1 5432 1,翻轉區間是 2,4 2,4 2,4 的話,結果是 523 415 2 3 4 1 52341。輸入格式 第一行兩個正整數 ...

P3391 模板 文藝平衡樹(Splay)

題目背景 這是一道經典的splay模板題 文藝平衡樹。題目描述 輸入輸出格式 輸入格式 第一行為n,m n表示初始序列有n個數,這個序列依次是 1,2,n 1,n m表示翻轉操作次數 接下來m行每行兩個數 l,r 資料保證 1 l r n 輸出格式 輸出一行n個數字,表示原始序列經過m次變換後的結果...

P3391 模板 文藝平衡樹(Splay)

基於這道題的關於splay的講解 將由這篇部落格開始。include include include include include include include include include include include include define lowbit x x x define ...