洛谷 P3835: 【模板】可持久化平衡树
题目传送门:洛谷P3835。
题意简述:
题面说的很清楚了。
题解:
考虑建立一棵每个节点都表示一个版本的树。
以初始版本 \(0\) 为根。对于第 \(i\) 个操作,从 \(v_i\) 向 \(i\) 连一条边,而边权则是 \(opt_i\) 和 \(x_i\) 的二元组,表示经过这条边上操作,可以达到下一个状态。
考虑使用权值树状数组维护操作。只需要实现单点加,查询前缀和以及树状数组上二分的操作即可。
树状数组提前插入 \(-2147483647\) 和 \(2147483647\) 两个数,方便统计。
因为权值范围太大,所以先离散化权值,再插入树状数组。
只需要从结点 \(0\) 开始 DFS ,进入子树时执行操作,退出子树时撤销操作即可。
#include <cstdio>
#include <algorithm>
using namespace std; const int INF = 0x7fffffff;
const int MQ = ; int N, Q;
int faz[MQ], opt[MQ], a[MQ], b[MQ];
int Ans[MQ]; int eh[MQ], nxt[MQ], to[MQ], tot;
inline void ins(int x, int y) {
nxt[++tot] = eh[x]; to[tot] = y; eh[x] = tot;
} int B[MQ];
inline void Add(int i, int x) { for (; i <= N; i += i & -i) B[i] += x; }
inline int Qur(int i) { int A = ; for (; i; i -= i & -i) A += B[i]; return A; }
inline int BS(int x) { int p = ; for (int j = << ; j; j >>= ) if ((p | j) <= N && B[p | j] <= x) x -= B[p |= j]; return p;} void DFS(int u, int o, int x) {
int ok = ;
if (o == ) Add(x, );
if (o == ) {
if (Qur(x) == Qur(x - )) ok = ;
else Add(x, -);
}
if (o == ) Ans[u] = Qur(x - );
if (o == ) Ans[u] = b[BS(x) + ];
if (o == ) Ans[u] = b[BS(Qur(x - ) - ) + ];
if (o == ) Ans[u] = b[BS(Qur(x)) + ]; for (int i = eh[u]; i; i = nxt[i])
DFS(to[i], opt[to[i]], a[to[i]]); if (o == ) Add(x, -);
if (o == && ok) Add(x, );
} int main() {
scanf("%d", &Q);
for (int i = ; i <= Q; ++i) {
scanf("%d%d%d", &faz[i], &opt[i], &a[i]);
if (opt[i] != )
b[++N] = a[i];
} b[++N] = -INF, b[++N] = INF;
sort(b + , b + N + );
N = unique(b + , b + N + ) - b - ;
for (int i = ; i <= Q; ++i) {
ins(faz[i], i);
if (opt[i] != )
a[i] = lower_bound(b + , b + N + , a[i]) - b;
}
Add(, ), Add(N, );
DFS(, , );
for (int i = ; i <= Q; ++i) {
if(opt[i] > )
printf("%d\n", Ans[i]);
}
return ;
}
洛谷 P3835: 【模板】可持久化平衡树的更多相关文章
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...
- 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]
题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...
- 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)
题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3835 【模板】可持久化平衡树
题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- luoguP3835 [模板]可持久化平衡树
https://www.luogu.org/problemnew/show/P3835 因为博主精力和实力有限,学不懂 fhq treap 了,因此只介绍 leafy tree 解法 leafy tr ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
随机推荐
- shell的sort命令
sort命令以行为单位对文本进行排序. 命令语法: sort [-b/d/f/g/i/M/n/r] [InFile] 参数解释: -b: ignore-leading-blanks,忽略前面空格符部分 ...
- MT【120】保三角函数
评:1.这里处理第三个函数时用到$ab-a-b=(a-1)(b-1)-1$是处理$ab,a+b$之间加减的常见变形. 2.第二个函数$g(x)=sinx,x\in(0,\frac{5\pi}{6})$ ...
- Android Support Palette使用详解
使用Palette API选择颜色 良好的视觉设计是app成功所必不可少的, 而色彩设计体系是设计的基础构成. Palette包是支持包, 能够从图片中解析出突出的颜色, 从而帮助你创建出视觉迷人的应 ...
- BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】
题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...
- windows 10 enterprise 企业版 mak激活密钥
企业版用户请依次输入: slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43 slmgr /skms kms.xspace.in slmgr /ato
- [HAOI2011]防线修建
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- O(1)时间复杂度求栈中最小元素
import java.util.Stack; /** * 功能:O(1)时间复杂度求栈中最小元素 * 思路:空间换取时间,使用两个栈,stack1栈存储数据,stack2栈存储最小值: * stac ...
- python set() 集合的添加删除、交集、并集、差集、交叉补集、集合的方法介绍以及使用案例
可变不可变: 1.可变:列表.字典.例如列表类型是可变的,我修改了列表中的元素的值,但是列表本身在内存中的地址是没有变化的,所以列表的元素是可以被改变的 >>> name=[&quo ...
- Git7:使用Gitlab管理远程仓库
目录 1.安装 2.gitlab基本配置 3.gitlab的邮件配置 3.1.使用本地的postfix发送邮件 3.2.使用邮件发送模板 3.3.使用腾讯企业邮箱配置发送邮件 3.4.使用163邮箱来 ...
- nova-compute源码分析
源码版本:H版 首先看启动脚本如下: /usr/bin/nova-compute import sys from nova.cmd.compute import main if __name__ == ...