题目传送门:洛谷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: 【模板】可持久化平衡树相关推荐

  1. 洛谷.3919.[模板]可持久化数组(可持久化线段树/平衡树)

    题目链接 //利用先前的根节点建树 想一下不难写. #include <cstdio> #include <cctype> //#define gc() getchar() # ...

  2. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  3. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  4. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  5. YBTOJ洛谷P2042:维护数列(平衡树)

    文章目录 题目描述 解析 删除区间 插入数列 修改&翻转 区间和&最大子段和 代码 传送门 题目描述 解析 阴间题- 这不是裸的板子吗? 国赛真的有人能把这题写出来吗- 应该算一道练习 ...

  6. 强连通分量:洛谷P3387 模板:缩点

    传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...

  7. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  8. 洛谷 P1919 模板】A*B Problem升级版(FFT快速傅里叶)

    https://www.luogu.com.cn/problem/P1919 题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a ...

  9. [模板]可持久化平衡树

    一.题目 点此看题 二.解法 其实可持久化的思路很简单,就是你永远不改原版,而是在新建点上修改. 所以在merge,split\text{merge,split}merge,split的时候用新开的点 ...

最新文章

  1. svg: svg预定义的形状
  2. Navcat:1251 client does not support ...问题
  3. Class的getInterfaces与getGenericInterface区别
  4. 前端学习(2367):两种方式导航跳转和传参
  5. 赛码网算法: 军训队列( python实现 )
  6. 两个unit取和会溢出吗_真正“爱”一个人时,就会涌现这种强烈的感觉,你曾经体验过吗?...
  7. c多线程并发处理方式_Java并发基础,不怕你看不懂
  8. java包含某个字符串_JavaScript判断一个字符串是否包含指定子字符串的方法
  9. Android Handler机制详解
  10. 教你有效清理C盘空间不足的方法
  11. 整数划分问题将正整数n表示成一系列正整数之和
  12. 《Kotlin 程序设计》第十二章 Kotlin的多线程:协程(Coroutines)
  13. java计算机毕业设计网络招聘系统源码+系统+数据库+lw文档+mybatis+运行部署
  14. 用计算机计算的定义,计算(数学用语)_百度百科
  15. html计算平方米,尺和平方米换算(尺与平方米换算计算器)
  16. java_vinson_03:java变量与常量
  17. 鸿蒙系统剽窃,外媒再爆猛料!质疑华为鸿蒙系统抄袭:被指山寨谷歌安卓11系统...
  18. 五、伊森商城 前端基础-Vue v-on 事件修饰符 按键修饰符 v-for v-if 和v-show v-else和v-else-if p24
  19. Auto CAD中“旋转”命令怎么使用?
  20. wcdma系统随机接入过程的流程图_WCDMA系统随机接入过程浅析

热门文章

  1. 使用JFlex生成词法分析器 1:安装配置
  2. [湖南师大集训2018 7 26] hunger 解题报告 (SPFA)
  3. java中的单例模型
  4. [LintCode笔记了解一下]64.合并排序数组
  5. Flash网站流量统计的方法
  6. .net 垃圾回收学习[How To: Use CLR Profiler][翻译学习]【2】
  7. DevExpress控件之GridControl控件
  8. Javascript高级程序设计第二版第十四章--异常--笔记
  9. python os.listdir列举当前文件夹下所有文件及文件夹
  10. Java中Map的使用