洛谷 P3391 模板 文藝平衡樹(Splay)

2022-04-04 21:59:55 字數 1528 閱讀 7033

這是一道經典的splay模板題——文藝平衡樹。

輸入格式:

第一行為n,m n表示初始序列有n個數,這個序列依次是(1,2, \cdots n-1,n)(1,2,⋯n−1,n) m表示翻轉操作次數

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

輸出格式:

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

輸入樣例#1:

5 3

1 31 3

1 4

輸出樣例#1:

4 3 2 1 5

n, m \leq 100000n,m≤100000

splay區間操作

把l-1旋到根,r+1旋到右節點,打上flag標記。

屠龍寶刀點選就送

#include #include 

#include

#define inf 0x7fffffff

#define n 100010

using

namespace

std;

inline

void read(int &x)

struct

node

}d[n];

int data[n],flag[n],ch[n][2

],fa[n],siz[n],root,n,m,cn,mn[n],pos[n];

inline

int min(int a,int b)

inline

void pushup(int

x)inline

void pushdown(intx)}

inline

int son(int x)

int getkth(int rt,int

k)inline

void rotate(int

x)void splay(int x,int

i)

else}}

}void reverse(int l,int

r)void dfs(int

x)int

main()

sort(d+2,d+2+n);

for(int i=2;i<=n+1;i++) data[d[i].pos]=i;

data[

0]=data[1]=data[n+2]=inf;

for(int i=0;i<=n+2;i++) mn[i]=inf;

root=1

; siz[

0]=0

;

for(int i=1;i<=n+2;i++)

ch[n+2][1]=0

;

for(int i=n+2;i>=1;i--) pushup(i);

for(int l,r,i=1;i<=m;i++)

dfs(root);

return0;

}

洛谷 P3391 模板 文藝平衡樹

真正的模板題,先用splay把這個題打熟了再來做這個題qwq splay的基本操作我就不講了,直接說一說這個題的做法 首先我們把序列放到一棵樹上,使得這棵樹的中序遍歷為原序列,這個建樹操作和線段樹類似,遞迴建立左右兒子,然後進行兩個操作 f in dfind find 獲取序列第x xx位置上的值 ...

洛谷 P3391 模板 文藝平衡樹

這是一道經典的splay模板題 文藝平衡樹。您需要寫一種資料結構,來維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 輸入格式 第一行為n,m n,m 100000 n表示初始序列有n個數,這個序列依次是 1...

洛谷P3391 模板 文藝平衡樹

您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列。其中需要提供以下操作 翻轉乙個區間,例如原有序序列是 5 4 3 2 1 翻轉區間是 2,4 的話,結果是 5 2 3 4 1 splay 模板。總算是會摳 splay 了。treap 採用鍵值隨機化來維護 bst 平衡,而 splay 則採...