【luogu P5055】【模板】可持久化文艺平衡树
【模板】可持久化文艺平衡树
题目链接:luogu P5055
题目大意
要你维护插入,删除,区间翻转,区间求和。
但要求可持续化,即每次操作在一个历史版本上进行,且会产生一个新的历史版本
思路
看到题目都是可持续化平衡树了。
直接上 splay,这题要多搞一个 down。
down 交换左右儿子之前要复制左右儿子。
然后其他的就跟 可持久化平衡树 是差不多的了。
代码
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long longusing namespace std;int n, rt[200001], bb, op, x, y, tot;
int ls[200001 << 7], rs[200001 << 7], yj[200001 << 7], sz[200001 << 7];
bool turn[200001 << 7];
ll sum[200001 << 7], lastans, val[200001 << 7];int newpoint(ll num) {int re = ++tot;ls[re] = rs[re] = turn[re] = 0;val[re] = num;sum[re] = num;yj[re] = rand();sz[re] = 1;return re;
}int copypoint(int pl) {int re = ++tot;ls[re] = ls[pl];rs[re] = rs[pl];val[re] = val[pl];sum[re] = sum[pl];yj[re] = yj[pl];turn[re] = turn[pl];sz[re] = sz[pl];return re;
}void up(int now) {sz[now] = sz[ls[now]] + sz[rs[now]] + 1;sum[now] = sum[ls[now]] + sum[rs[now]] + val[now];
}void down(int now) {if (turn[now]) {if (ls[now]) ls[now] = copypoint(ls[now]);//记得翻转前左右儿子要复制if (rs[now]) rs[now] = copypoint(rs[now]);swap(ls[now], rs[now]);if (ls[now]) turn[ls[now]] ^= 1;if (rs[now]) turn[rs[now]] ^= 1;turn[now] ^= 1;}
} pair <int, int> split_rnk(int now, int rnk) {if (!now) return make_pair(0, 0);if (!rnk) return make_pair(0, copypoint(now));down(now);pair <int, int> re;if (rnk <= sz[ls[now]]) {int noww = copypoint(now);re = split_rnk(ls[noww], rnk);ls[noww] = re.second;up(noww);re.second = noww;}else {int noww = copypoint(now);re = split_rnk(rs[noww], rnk - sz[ls[now]] - 1);rs[noww] = re.first;up(noww);re.first = noww;}return re;
}int merge(int x, int y) {if (x) down(x);if (y) down(y);if (!x) return y;if (!y) return x;if (yj[x] < yj[y]) {int xx = copypoint(x);rs[xx] = merge(rs[xx], y);up(xx);return xx;}else {int yy = copypoint(y);ls[yy] = merge(x, ls[yy]);up(yy);return yy;}
}void insert(int bb, int pl, int num) {pair <int, int> x = split_rnk(rt[bb], pl);int y = newpoint(num);rt[bb] = merge(x.first, merge(y, x.second));
}void delete_(int bb, int pl) {pair <int, int> x = split_rnk(rt[bb], pl - 1);pair <int, int> y = split_rnk(x.second, 1);rt[bb] = merge(x.first, y.second);
}void turn_(int bb, int l, int r) {pair <int, int> x = split_rnk(rt[bb], l - 1);pair <int, int> y = split_rnk(x.second, r - l + 1);turn[y.first] ^= 1;rt[bb] = merge(merge(x.first, y.first), y.second);
}ll get_sum(int bb, int l, int r) {pair <int, int> x = split_rnk(rt[bb], l - 1);pair <int, int> y = split_rnk(x.second, r - l + 1);return sum[y.first];
}int main() {srand(19491001);scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d %d", &bb, &op);rt[i] = rt[bb];if (op == 1) {scanf("%d %d", &x, &y);x ^= lastans; y ^= lastans;insert(i, x, y); continue;}if (op == 2) {scanf("%d", &x);x ^= lastans;delete_(i, x);continue;}if (op == 3) {scanf("%d %d", &x, &y);x ^= lastans;y ^= lastans;turn_(i, x, y);continue;}if (op == 4) {scanf("%d %d", &x, &y);x ^= lastans;y ^= lastans;lastans = get_sum(i, x, y);printf("%lld\n", lastans);}}return 0;
}
【luogu P5055】【模板】可持久化文艺平衡树相关推荐
- P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...
- P5055 【模板】可持久化文艺平衡树
P5055 [模板]可持久化文艺平衡树 突然发现fhq_treap也是可以支持区间翻转的,所以基本上和其他平衡树是一样的,而且还满足重量平衡树的性质,真是太优秀了,只不过常数稍微比较大. 然后这里我们 ...
- luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap
luoguP5055 [模板]可持久化文艺平衡树 可持久化非旋转treap 好题. Code: #include<bits/stdc++.h> using namespace std; # ...
- 【LG5055】可持久化文艺平衡树
[LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...
- P5055【模板】可持久化文艺平衡树
题面 https://www.luogu.org/problem/P5055 题解 #include<cstdio> #include<iostream> #include&l ...
- 【FHQ Treap】洛谷P5055 【模板】可持久化文艺平衡树
DescriptionDescriptionDescription 写一种数据结构,要求支持插入,删除,查询区间和,区间翻转且可持久化 SolutionSolutionSolution 无旋Treap ...
- 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...
- fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...
题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...
- 洛谷 P3391 【模板】文艺平衡树
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...
最新文章
- J-link v8固件修复
- 【SmartJob】配置说明
- 《Java从入门到放弃》框架入门篇:hibernate基本配置
- 服务器异常下电文件系统,SUN服务器Solaris异常情况下恢复操作步骤(8页)-原创力文档...
- 开源 -- 机器学习相关报道
- 【转】 测试人员的职业规划 --整理标注
- android 字体像素转换工具类_Android点9图机制及在聊天气泡中的应用
- android俄罗斯方块开发代码,基于Android的俄罗斯方块开发(附源码)
- 群体智能优化算法之粒子群优化算法
- 1302数码管c语言程序,基于AVR单片机的DS1302数码管时间显示C语言程序设计
- 工资计算器的小demo
- 夏普SHARP MX-3508N 一体机驱动
- 连续分配、链接分配和索引分配详解
- NetSuite 财务科目合并
- 欢迎页面welcome.jsp
- android tf卡及u盘_一体化储存芯片(U 盘、SD卡、TF卡) NAND定义开发-U盘篇
- Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
- SQL语句--简单的函数书写举例(3)
- 暴走欧洲之文明的迭代
- java 取消引用_java编译时所说的“无法取消引用”是什么意思