洛谷 P3835 模板 可持久化平衡樹

2022-03-29 06:13:27 字數 1736 閱讀 8138

題目傳送門:洛谷p3835。

題意簡述:

題面說的很清楚了。

題解:

考慮建立一棵每個節點都表示乙個版本的樹。

以初始版本 \(0\) 為根。對於第 \(i\) 個操作,從 \(v_i\) 向 \(i\) 連一條邊,而邊權則是 \(opt_i\) 和 \(x_i\) 的二元組,表示經過這條邊上操作,可以達到下乙個狀態。

考慮使用權值樹狀陣列維護操作。只需要實現單點加,查詢字首和以及樹狀陣列上二分的操作即可。

樹狀陣列提前插入 \(-2147483647\) 和 \(2147483647\) 兩個數,方便統計。

因為權值範圍太大,所以先離散化權值,再插入樹狀陣列。

只需要從結點 \(0\) 開始 dfs ,進入子樹時執行操作,退出子樹時撤銷操作即可。

1 #include 2 #include 3

using

namespace

std;45

const

int inf = 0x7fffffff;6

const

int mq = 500010;7

8int

n, q;

9int

faz[mq], opt[mq], a[mq], b[mq];

10int

ans[mq];

1112

inteh[mq], nxt[mq], to[mq], tot;

13 inline void ins(int x, int

y) 16

17int

b[mq];

18 inline void add(int i, int x)

19 inline int qur(int i)

20 inline int bs(int x)

2122

void dfs(int u, int o, int

x) 29

if (o == 3) ans[u] = qur(x - 1

);30

if (o == 4) ans[u] = b[bs(x) + 1

];31

if (o == 5) ans[u] = b[bs(qur(x - 1) - 1) + 1

];32

if (o == 6) ans[u] = b[bs(qur(x)) + 1

];33

34for (int i = eh[u]; i; i =nxt[i])

35dfs(to[i], opt[to[i]], a[to[i]]);

3637

if (o == 1) add(x, -1

);38

if (o == 2 && ok) add(x, 1

);39}40

41int

main() b[++n] = -inf, b[++n] =inf;

48 sort(b + 1, b + n + 1

);49 n = unique(b + 1, b + n + 1) - b - 1;50

for (int i = 1; i <= q; ++i)

55 add(1, 1), add(n, 1

);56 dfs(0, 0, 0

);57

for (int i = 1; i <= q; ++i)

61return0;

62 }

洛谷P3835 模板 可持久化平衡樹

本題為題目 普通平衡樹 的可持久化加強版。資料已經經過強化 插入x數 刪除x數 若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數,如不存在輸出 21...

洛谷 P3835 模板 可持久化平衡樹

可持久化平衡樹 可持久化 treap 1.插入 x 2.刪除 x 3.查詢 x 的排名 4.查詢排名為 x 的數 5.求 x 的前驅 6.求 x 的後繼 每次操作都基於某一歷史版本,同時生成乙個新的版本 include include include define maxn 500010 using...

洛谷P3835 模板 可持久化平衡樹

本題為題目 普通平衡樹 的可持久化加強版。資料已經經過強化 插入x數 刪除x數 若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數,如不存在輸出 21...