【LG3835】可持久化平衡树
【LG3835】可持久化平衡树
题面
解法一
rope大法好
\(rope\)基本操作:
#include<ext/rope>
using namespace __gnu_cxx;//rope的命名空间
rope<type> R;
R.push_back(a) //往后插入
R.insert(pos,a)//在pos位置插入a,pos是一个迭代器。
R.erase(pos,n)//在pos位置删除n个元素。
R.replace(pos,x)//从pos开始替换成x
R.substr(pos,x)//从pos开始提取x个。
//多数时候定义rope用指针(方便可持久化) 所以上面的点多数时候要换成->
再配合二分即可实现各种操作
如何进行复制:
rope<type>* R[1000];
R[i] = new rope<type>(*R[v]);
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <ext/rope>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_cxx;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (ch != '-' && (ch > '9' || ch < '0')) ch = getchar();
if (ch == '-') w = -1 , ch = getchar();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
return w * data;
}
#define MAX_N 500005
rope<int> *rop[MAX_N];
int N;
int main () {
N = gi();
rop[0] = new rope<int>();
for (int i = 1; i <= N; i++) {
int v = gi(), opt = gi(), x = gi();
rop[i] = new rope<int>(*rop[v]);
if (opt == 1) rop[i]->insert(lower_bound(rop[i]->begin(), rop[i]->end(), x) - rop[i]->begin(), x);
if (opt == 2) {
auto ite = lower_bound(rop[i]->begin(), rop[i]->end(), x);
if (ite != rop[i]->end() && *ite == x) rop[i]->erase(ite - rop[i]->begin(), 1);
}
if (opt == 3)
printf("%d\n", (int)(lower_bound(rop[i]->begin(), rop[i]->end(), x) - rop[i]->begin()) + 1);
if (opt == 4) printf("%d\n", *(rop[i]->begin() + x - 1));
if (opt == 5) {
auto ite = lower_bound(rop[i]->begin(), rop[i]->end(), x);
if (ite == rop[i]->begin() - 1) puts("-2147483647");
else --ite, printf("%d\n", *ite);
}
if (opt == 6) {
auto ite = upper_bound(rop[i]->begin(), rop[i]->end(), x);
if (ite == rop[i]->end()) puts("2147483647");
printf("%d\n", *ite);
}
}
return 0;
}
解法二
用可持久化\(trie\)可以很方便地实现
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int MAX_N = 5e5 + 5;
const int T = 1e9;
struct Trie { int ch[2], size; } t[MAX_N << 5];
int N, rt[MAX_N], tot;
bool find(int o, int v) {
v += T;
for (int i = 31; ~i; i--) {
int c = v >> i & 1;
if (!t[o].size || !o) return 0;
o = t[o].ch[c];
}
return 1;
}
void insert(int &x, int p, int v) {
x = ++tot; int o = x;
v += T, t[o].size = t[p].size + 1;
for (int i = 31; ~i; i--) {
int c = v >> i & 1;
t[o].ch[c ^ 1] = t[p].ch[c ^ 1];
t[o].ch[c] = ++tot;
o = t[o].ch[c], p = t[p].ch[c];
t[o].size = t[p].size + 1;
}
}
void erase(int &x, int p, int v) {
if (!find(p, v)) return (void)(x = p);
x = ++tot; int o = x;
v += T, t[o].size = t[p].size - 1;
for (int i = 31; ~i; i--) {
int c = v >> i & 1;
t[o].ch[c ^ 1] = t[p].ch[c ^ 1];
t[o].ch[c] = ++tot;
o = t[o].ch[c], p = t[p].ch[c];
t[o].size = t[p].size - 1;
}
}
int Kth(int o, int k) {
long long res = -T;
for (int i = 31; ~i; i--) {
int sz = t[t[o].ch[0]].size;
if (k <= sz) o = t[o].ch[0];
else res += (1 << i), o = t[o].ch[1], k -= sz;
}
return res;
}
int LR(int o, int v) {
v += T; int res = 0;
for (int i = 31; ~i; i--) {
int c = v >> i & 1;
if (c) res += t[t[o].ch[0]].size;
o = t[o].ch[c];
if (!o || !t[o].size) return res;
}
return res;
}
int UR(int o, int v) {
v += T; int res = 0;
for (int i = 31; ~i; i--) {
int c = v >> i & 1;
if (!c) res += t[t[o].ch[1]].size;
o = t[o].ch[c];
if (!o || !t[o].size) return res;
}
return res;
}
int Rnk(int o, int v) { return LR(o, v) + 1; }
signed main () {
N = gi();
rt[0] = ++tot;
for (int i = 1; i <= N; i++) {
int v = gi(), op = gi(), x = gi();
if (op == 1) insert(rt[i], rt[v], x);
if (op == 2) erase(rt[i], rt[v], x);
if (op == 3) rt[i] = rt[v], printf("%d\n", Rnk(rt[i], x));
if (op == 4) rt[i] = rt[v], printf("%d\n", Kth(rt[i], x));
if (op == 5) {
rt[i] = rt[v];
int res = LR(rt[i], x);
if (!res) printf("%d\n", -INT_MAX);
else printf("%d\n", Kth(rt[i], res));
}
if (op == 6) {
rt[i] = rt[v];
int res = UR(rt[i], x);
if (!res) printf("%d\n", INT_MAX);
else printf("%d\n", Kth(rt[i], t[rt[i]].size - res + 1));
}
}
return 0;
}
【LG3835】可持久化平衡树的更多相关文章
- LG3835 【模板】可持久化平衡树
题意 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名 ...
- 可持久化Trie & 可持久化平衡树 专题练习
[xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...
- [Luogu 3835]【模板】可持久化平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作 ...
- 洛谷P3835 【模板】可持久化平衡树
题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...
- P3835 【模板】可持久化平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的 ...
- [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树
[cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...
- luoguP3835 [模板]可持久化平衡树
https://www.luogu.org/problemnew/show/P3835 因为博主精力和实力有限,学不懂 fhq treap 了,因此只介绍 leafy tree 解法 leafy tr ...
- C++ STL rope介绍----可持久化平衡树
大致介绍: rope这个东西,我刚刚知道这玩意,用的不是很多,做个简单的介绍. 官方说明:我是刘邦(我估计你是看不懂的). rope就是一个用可持久化平衡树实现的“重型”string(然而它也可以保存 ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
随机推荐
- 【[SCOI2016]背单词】
这是一道贪心题 刚开始yy出来一个比较\(sb\)的贪心 之后发现它错了 首先这道题得先把题面翻译成人话 如果存在一个单词是它的后缀,且当前没被填入,代价为\(n*n\): 如果不存在一个单词是它的后 ...
- LayIM.AspNetCore Middleware 开发日记(六)嵌入资源的使用,layim.config的封装
前言 距离上一篇博客竟然已经10多天了...工作上的事,个人原因,种种吧.不多说废话,本文将会重点介绍layim的入口配置. LayIM配置 其实在开发者文档里面已经描述的很清楚了.除了几个重要的接口 ...
- windows7系统PC机耳机没有声音
排除耳机故障和主机耳机孔等硬件问题之后 可能情况: 1.进行音量设置 2.更新声卡驱动 (使用驱动程序进行检测并进行更新) 360驱动大师 驱动精灵 3.windwows相关设置存在问题 (1)打开控 ...
- PAT——1061. 判断题
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量.第二行给出M个不超过5的正 ...
- 1<=portNo<=4竟然在keil4.71里面不报错
1.if( 1<=portNo<=4 ) { CardIn2_CS_L; //pull low CardIn1_CS_H; CardOut1_CS_H; CardOut2_CS_H ...
- Backward compatibility
向后兼容
- Angular7教程-05-搭建项目环境
1. 本节说明 本节以及后面的内容我们将会通过搭建一个简单的博客程序来对angular进行介绍,项目使用前端框架是bootstrap.版本v3.3.7,另外需要安装jquery.关于bootstrap ...
- c#的传输组件dotnetty
牛皮不多了,绩效吹起.... 最近一直看大家写的东西,了解的内容不少,我的牛皮也差不多吹完了.... 最后在说说最近测试的dotnetty.去年弄下来试了,不行,最近又弄下来了看看,可以了.哇哈哈哈哈 ...
- angular入门一之环境安装及项目创建
angular入门一之环境安装及项目创建 1.安装node.js 下载,安装,在终端测试安装是否成功:node -v(查看nodejs版本) npm -v(查看npm版本) 下载地址:https:// ...
- ABAP术语-Update Key
Update Key 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/20/1114171.html Unique character str ...