日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P3835: 【模板】可持久化平衡树

發布時間:2023/12/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P3835: 【模板】可持久化平衡树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目傳送門:洛谷P3835。

題意簡述:

題面說的很清楚了。

題解:

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

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

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

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

因為權值范圍太大,所以先離散化權值,再插入樹狀數組。

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

1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int INF = 0x7fffffff; 6 const int MQ = 500010; 7 8 int N, Q; 9 int faz[MQ], opt[MQ], a[MQ], b[MQ]; 10 int Ans[MQ]; 11 12 int eh[MQ], nxt[MQ], to[MQ], tot; 13 inline void ins(int x, int y) { 14 nxt[++tot] = eh[x]; to[tot] = y; eh[x] = tot; 15 } 16 17 int B[MQ]; 18 inline void Add(int i, int x) { for (; i <= N; i += i & -i) B[i] += x; } 19 inline int Qur(int i) { int A = 0; for (; i; i -= i & -i) A += B[i]; return A; } 20 inline int BS(int x) { int p = 0; for (int j = 1 << 18; j; j >>= 1) if ((p | j) <= N && B[p | j] <= x) x -= B[p |= j]; return p;} 21 22 void DFS(int u, int o, int x) { 23 int ok = 1; 24 if (o == 1) Add(x, 1); 25 if (o == 2) { 26 if (Qur(x) == Qur(x - 1)) ok = 0; 27 else Add(x, -1); 28 } 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 34 for (int i = eh[u]; i; i = nxt[i]) 35 DFS(to[i], opt[to[i]], a[to[i]]); 36 37 if (o == 1) Add(x, -1); 38 if (o == 2 && ok) Add(x, 1); 39 } 40 41 int main() { 42 scanf("%d", &Q); 43 for (int i = 1; i <= Q; ++i) { 44 scanf("%d%d%d", &faz[i], &opt[i], &a[i]); 45 if (opt[i] != 4) 46 b[++N] = a[i]; 47 } 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) { 51 ins(faz[i], i); 52 if (opt[i] != 4) 53 a[i] = lower_bound(b + 1, b + N + 1, a[i]) - b; 54 } 55 Add(1, 1), Add(N, 1); 56 DFS(0, 0, 0); 57 for (int i = 1; i <= Q; ++i) { 58 if(opt[i] > 2) 59 printf("%d\n", Ans[i]); 60 } 61 return 0; 62 }

?

轉載于:https://www.cnblogs.com/PinkRabbit/p/10026954.html

總結

以上是生活随笔為你收集整理的洛谷 P3835: 【模板】可持久化平衡树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。