洛谷P3391 模板 文藝平衡樹

2022-06-13 22:51:15 字數 1089 閱讀 6759

您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列。

其中需要提供以下操作:翻轉乙個區間,例如原有序序列是 \(5\ 4\ 3\ 2\ 1\),翻轉區間是 \([2,4]\) 的話,結果是 \(5\ 2\ 3\ 4\ 1\)。

splay 模板。總算是會摳 splay 了。

treap 採用鍵值隨機化來維護 bst 平衡,而 splay 則採用旋轉來維護 bst 平衡。基本上每進行一次關於 \(x\) 的操作,就把 \(x\) 旋轉至樹根。

對於區間旋轉的操作,我們以下標建立一棵 splay,對於旋轉 \([l,r]\),我們將 \(l\) 的前驅旋轉至樹根,\(r\) 的後繼旋轉至樹根的右子節點,那麼此時 \(r\) 的後繼的左子樹即為 \([l,r]\)。

那麼就把 \(r\) 後繼的左子樹的樹根打上乙個懶惰標記,下次旋轉該點時就將該點的左右子樹互換,類似線段樹的標記下傳。

時間複雜度不會證。

這份**還有很多地方可以簡化,但是太懶了。

#include #include #include using namespace std;

const int n=100010,inf=2e9;

int n,q,rt;

struct splay

void pushdown(int x) }

bool pos(int x)

void build()

void rotate(int x)

void splay(int x,int f=0)

rotate(x);

} if (!f) rt=x; }

void ins(int x)

pushup(p); pushup(f);

splay(p); }

int get_val(int k)

splay(p);

return p; }

void reverse(int l,int r)

}splay;

void dfs(int x)

int main()

dfs(rt);

return 0;

}

洛谷 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 模板 文藝平衡樹(Splay)

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