P3919 【模板】可持久化线段树 1(可持久化数组) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using i64 = long long;
  4. template<class Node>
  5. struct PersidentSegmentTree {
  6. #define lc(u) tr[u].l
  7. #define rc(u) tr[u].r
  8. #define val(u) tr[u].v
  9. const int n;
  10. int tot = 0;
  11. vector<Node> tr;
  12. vector<int> root;
  13. PersidentSegmentTree(): n(0) {}
  14. PersidentSegmentTree(int n_): n(n_) {
  15. int N = (n << 5) + 10;
  16. tr.reserve(N); root.reserve(N);
  17. tr.resize(N); root.resize(N);
  18. }
  19. PersidentSegmentTree(vector<int>& a): PersidentSegmentTree(a.size() - 1) {
  20. function<void(int&, int, int)> build = [&](int& now, int l, int r) {
  21. now = ++ tot;
  22. if (l == r) {
  23. val(now) = a[l];
  24. return ;
  25. }
  26. int m = (l + r) >> 1;
  27. build(lc(now), l, m);
  28. build(rc(now), m + 1, r);
  29. };
  30. build(root[0], 1, n);
  31. }
  32. //last代表前缀,now代表新树根
  33. void insert(int& now, int last, int l, int r, int pos, int w) {
  34. now = ++ tot;
  35. tr[now] = tr[last];
  36. if (l == r) {
  37. val(now) = w;
  38. return;
  39. }
  40. int m = l + r >> 1;
  41. if (pos <= m)
  42. insert(lc(now), lc(last), l, m, pos, w);
  43. else
  44. insert(rc(now), rc(last), m + 1, r, pos, w);
  45. }
  46. //单点
  47. int query(int now, int l, int r, int pos) {
  48. if (l == r) {
  49. return val(now);
  50. }
  51. int m = l + r >> 1;
  52. if (pos <= m)
  53. return query(lc(now), l, m, pos);
  54. else
  55. return query(rc(now), m + 1, r, pos);
  56. }
  57. //区间查询 [u,v]->[root[l-1],root[r]]
  58. int query(int u, int v, int l, int r, int pos) {
  59. if (l == r) {
  60. return val(v);
  61. }
  62. int m = l + r >> 1;
  63. if (pos <= m)
  64. return query(lc(u), lc(v), l, m, pos);
  65. else
  66. return query(rc(u), rc(v), m + 1, r, pos);
  67. }
  68. };
  69. struct Node {
  70. int l, r, v;
  71. };
  72. int main() {
  73. ios::sync_with_stdio(false);
  74. cin.tie(nullptr);
  75. int n, q;
  76. cin >> n >> q;
  77. vector<int> a(n + 1);
  78. for (int i = 1; i <= n; i ++)
  79. cin >> a[i];
  80. PersidentSegmentTree<Node> pst(a);
  81. for (int i = 1; i <= q; i ++) {
  82. int v, op, pos;
  83. cin >> v >> op >> pos;
  84. if (op == 1) {
  85. int val;
  86. cin >> val;
  87. pst.insert(pst.root[i], pst.root[v], 1, n, pos, val);//新建版本
  88. } else {
  89. cout << pst.query(pst.root[v], 1, n, pos) << '\n';
  90. pst.root[i] = pst.root[v];//保存当前版本
  91. }
  92. }
  93. return 0;
  94. }

【主席树】P3919 【模板】可持久化线段树 1的更多相关文章

  1. 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  2. BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector

    题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...

  3. 【洛谷P3834】(模板)可持久化线段树 1(主席树)

    [模板]可持久化线段树 1(主席树) https://www.luogu.org/problemnew/show/P3834 主席树支持历史查询,空间复杂度为O(nlogn),需要动态开点 本题用一个 ...

  4. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  5. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

  6. 【BZOJ4704】旅行 树链剖分+可持久化线段树

    [BZOJ4704]旅行 Description 在Berland,有n个城堡.每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且 ...

  7. [GDOI2016] 疯狂动物园 [树链剖分+可持久化线段树]

    题面 太长了,而且解释的不清楚,我来给个简化版的题意: 给定一棵$n$个点的数,每个点有点权,你需要实现以下$m$个操作 操作1,把$x$到$y$的路径上的所有点的权值都加上$delta$,并且更新一 ...

  8. 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)

    题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...

  9. Codeforces986E Prince's Problem 【虚树】【可持久化线段树】【树状数组】

    我很喜欢这道题. 题目大意: 给出一棵带点权树.对每个询问$ u,v,x $,求$\prod_{i \in P(u,v)}gcd(ai,x)$.其中$ P(u,v) $表示$ u $到$ v $的路径 ...

  10. 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

随机推荐

  1. 结构型模式(Structural Pattern)

    模式介绍 结构型模式(Structural Pattern)的主要目的就是将不同的类和对象组合在一起,形成更大或者更复杂的结构体.该模式并不是简单地将这些类或对象摆放在一起,而是要提供它们之间的关联方 ...

  2. CAEmitterLayer动画的开始和结束

    有个需求,要求模仿微信做表情下雨的动画,一开始想用CAEmitterLayer,实现的代码如下: //期望:显示特效五秒后结束特效 UIImage *image = [UIImage imageNam ...

  3. Grab 基于 Apache Hudi 实现近乎实时的数据分析

    介绍 在数据处理领域,数据分析师在数据湖上运行其即席查询.数据湖充当分析和生产环境之间的接口,可防止下游查询影响上游数据引入管道.为了确保数据湖中的数据处理效率,选择合适的存储格式至关重要. Vani ...

  4. 2019 香港区域赛 BDEG 题解

    B.Binary Tree 题意:给你一棵二叉树.有两个游戏者,回合制,他们每次可以删去这棵二叉树中的一棵满二叉树.求最后谁赢. 解法:每一棵满二叉树有奇数个节点,那么每次游戏者只能删去奇数个节点,所 ...

  5. Prometheus监控系统(二)Prometheus部署与使用

    1. Prometheus安装 官网:https://prometheus.io/ 下载地址:https://prometheus.io/download/ Prometheus基于Golang编写, ...

  6. Git 奇幻之旅⌛️续集

    第十二天:暂存未完成的修改 小明和小红在开发一个新功能时,他们需要切换到另一个分支去修复一个紧急的 bug .但是他们的当前分支上还有一些未完成的修改,他们不想提交这些修改,也不想丢弃这些修改.有一天 ...

  7. Vue源码剖析

    目录 Vue 响应式数据 Vue 中如何进行依赖收集 Vue 中模板编译原理 Vue 生命周期钩子 Vue 组件 data 为什么必须是个函数? nextTick 原理 set 方法实现原理 虚拟 d ...

  8. Django配置为连接到Microsoft SQL Server

    可以将Django配置为连接到Microsoft SQL Server 2019.为此,你需要更改数据库设置中的一些配置选项.首先,确保你已经安装了 django 和 pyodbc 这两个库:   p ...

  9. [oeasy]python0072_整数类型_int_integer_整型变量

    帮助手册 回忆上次内容   上次了解的是 字符串 字符串 就是 字符的串 字符串长度 可以用 len函数 字符可以用下标索引 []   可以用str 将整型数字 转化为 字符串   字符的长度本身 有 ...

  10. 靶机: AdmX_new

    靶机: AdmX_new 准备阶段 靶机:https://download.vulnhub.com/admx/AdmX_new.7z 下载后进行 MD5:2948034da23a8acc1285fd4 ...