題目傳送門:洛谷p3835。
題意簡述:
題面說的很清楚了。
題解:
考慮建立一棵每個節點都表示乙個版本的樹。
以初始版本 \(0\) 為根。對於第 \(i\) 個操作,從 \(v_i\) 向 \(i\) 連一條邊,而邊權則是 \(opt_i\) 和 \(x_i\) 的二元組,表示經過這條邊上操作,可以達到下乙個狀態。
考慮使用權值樹狀陣列維護操作。只需要實現單點加,查詢字首和以及樹狀陣列上二分的操作即可。
樹狀陣列提前插入 \(-2147483647\) 和 \(2147483647\) 兩個數,方便統計。
因為權值範圍太大,所以先離散化權值,再插入樹狀陣列。
只需要從結點 \(0\) 開始 dfs ,進入子樹時執行操作,退出子樹時撤銷操作即可。
1 #include 2 #include 3using
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...