FHQ treap板子
感觉这个玩意就是拆来拆去,所以没啥可学习的
粘一下两个题的代码吧
LGOJ 普通平衡树
#include <bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm {
inline int read() {
int res = 0, f = 1;
char k;
while (!isdigit(k = getchar()))
if (k == '-')
f = -1;
while (isdigit(k)) res = res * 10 + k - '0', k = getchar();
return res * f;
}
const int N = 1e6 + 10, inf = 1e15 + 10;
int base = 12344, tot, rt;
int val[N], ls[N], rs[N], sz[N], rk[N];
inline int random() { return (base *= 102394) %= 239402, base; }
inline int add(int valn) {
sz[++tot] = 1;
ls[tot] = rs[tot] = 0;
val[tot] = valn;
rk[tot] = random();
return tot;
}
inline void update(int rt) {
sz[rt] = sz[ls[rt]] + sz[rs[rt]] + 1;
return;
}
inline void split(int rt, int &a, int &b, int valn) {
if (!rt)
return a = b = 0, void();
if (val[rt] <= valn)
a = rt, split(rs[rt], rs[a], b, valn);
else
b = rt, split(ls[rt], a, ls[b], valn);
return update(rt), void();
}
inline void merge(int &rt, int a, int b) {
if (!b || !a)
return rt = a + b, void();
if (rk[a] < rk[b])
rt = a, merge(rs[rt], rs[a], b);
else
rt = b, merge(ls[rt], a, ls[b]);
return update(rt), void();
}
inline void insert(int &rt, int val) {
int x = 0, y = 0, now = add(val);
split(rt, x, y, val);
merge(x, x, now);
merge(rt, x, y);
return;
}
inline void del(int &rt, int val) {
int x = 0, y = 0, z = 0;
split(rt, x, y, val);
split(x, x, z, val - 1);
merge(z, ls[z], rs[z]);
merge(x, x, z);
merge(rt, x, y);
return;
}
inline int get_kth(int rt, int k) {
while (sz[ls[rt]] + 1 != k) {
if (sz[ls[rt]] >= k)
rt = ls[rt];
else
k -= sz[ls[rt]] + 1, rt = rs[rt];
}
return val[rt];
}
inline int get_rank(int &rt, int val) {
int x = 0, y = 0;
split(rt, x, y, val - 1);
int tmp = sz[x] + 1;
merge(rt, x, y);
return tmp;
}
inline int get_pre(int &rt, int valn) {
int x = 0, y = 0;
split(rt, x, y, valn - 1);
int tmp = get_kth(x, sz[x]);
merge(rt, x, y);
return tmp;
}
inline int get_nxt(int &rt, int valn) {
int x = 0, y = 0;
split(rt, x, y, valn);
int tmp = get_kth(y, 1);
merge(rt, x, y);
return tmp;
}
signed main() {
int n = read();
add(inf);
tot = 1;
sz[1] = 0;
rt = 1;
while (n--) {
int opt = read(), valn = read();
switch (opt) {
case 1:
insert(rt, valn);
break;
case 2:
del(rt, valn);
break;
case 3:
printf("%lld\n", get_rank(rt, valn));
break;
case 4:
printf("%lld\n", get_kth(rt, valn));
break;
case 5:
printf("%lld\n", get_pre(rt, valn));
break;
case 6:
printf("%lld\n", get_nxt(rt, valn));
break;
}
}
return 0;
}
} // namespace yspm
signed main() { return yspm::main(); }
NOI2015 维护数列
#include <bits/stdc++.h>
#define int long long
using namespace std;
namespace yspm{
int st[500005], len;
inline int read() {
int res = 0, f = 1;
char k;
while (!isdigit(k = getchar()))
if (k == '-')
f = -1;
while (isdigit(k)) res = res * 10 + k - '0', k = getchar();
return res * f;
}
struct node {
int l, r, s, val, cov;
bool lz, fl;
int sum, qz, hz, zd;
} t[500005];
int id, rt;
int add(int v) {
id = st[len--];
t[id].l = t[id].r = t[id].lz = t[id].cov = 0;
t[id].s = 1;
t[id].val = t[id].sum = v;
t[id].qz = t[id].hz = max(0ll, v);
t[id].zd = v;
return id;
}
void push_up(int x) {
if (!x)
return;
t[x].s = t[t[x].l].s + t[t[x].r].s + 1;
t[x].sum = t[t[x].l].sum + t[t[x].r].sum + t[x].val;
t[x].qz = max(max(t[t[x].l].qz, t[t[x].l].sum + t[x].val + t[t[x].r].qz), 0ll);
t[x].hz = max(max(t[t[x].r].hz, t[t[x].r].sum + t[x].val + t[t[x].l].hz), 0ll);
t[x].zd = max(t[x].val, t[x].val + t[t[x].l].hz + t[t[x].r].qz);
if (t[x].l)
t[x].zd = max(t[x].zd, t[t[x].l].zd);
if (t[x].r)
t[x].zd = max(t[x].zd, t[t[x].r].zd);
}
void Reverse(int x) {
if (!x)
return;
swap(t[x].l, t[x].r);
swap(t[x].hz, t[x].qz);
t[x].lz ^= 1;
}
void Cover(int x, int ci) {
t[x].val = t[x].cov = ci;
t[x].sum = t[x].s * ci;
t[x].qz = t[x].hz = max(0ll, t[x].sum);
t[x].zd = max(ci, t[x].sum);
t[x].fl = 1;
}
void push_down(int x) {
if (!x)
return;
if (t[x].lz) {
if (t[x].l)
Reverse(t[x].l);
if (t[x].r)
Reverse(t[x].r);
t[x].lz = 0;
}
if (t[x].fl) {
if (t[x].l)
Cover(t[x].l, t[x].cov);
if (t[x].r)
Cover(t[x].r, t[x].cov);
t[x].cov = t[x].fl = 0;
}
}
void del(int x) {
if (!x)
return;
st[++len] = x;
if (t[x].l)
del(t[x].l);
if (t[x].r)
del(t[x].r);
}
void split(int x, int &L, int &R, int K) {
if (x)
push_down(x);
if (!x) {
L = R = 0;
return;
}
if (t[t[x].l].s + 1 <= K)
L = x, split(t[x].r, t[L].r, R, K - t[t[x].l].s - 1);
else
R = x, split(t[x].l, L, t[R].l, K);
push_up(x);
}
void merge(int x, int y, int &root) {
if (!x || !y) {
root = x + y;
return;
}
if (90000008 % (t[x].s + t[y].s) < t[x].s)
push_down(x), root = x, merge(t[x].r, y, t[root].r), push_up(x);
else
push_down(y), root = y, merge(x, t[y].l, t[root].l), push_up(y);
}
int n, m;
int A[500005];
int build(int l, int r) {
if (l == r) {
return add(A[l]);
}
int x, mid = (l + r) >> 1;
merge(build(l, mid), build(mid + 1, r), x);
return x;
}
char opt[10];
signed main() {
n = read(), m = read();
for (int i = 1; i <= 500000; ++i) st[++len] = i;
for (int i = 1; i <= n; ++i) A[i] = read();
merge(rt, build(1, n), rt);
while (m--) {
scanf("%s", opt);
if (opt[0] == 'I') {
int pos = read(), tot = read();
int x, y;
split(rt, x, y, pos);
for (int i = 1; i <= tot; ++i) A[i] = read();
merge(x, build(1, tot), x);
merge(x, y, rt);
} else if (opt[0] == 'D') {
int pos = read(), tot = read();
int x, y, z;
split(rt, x, y, pos - 1);
split(y, y, z, tot);
del(y);
merge(x, z, rt);
} else if (opt[0] == 'M' && opt[2] == 'K') {
int pos = read(), tot = read(), ci = read();
int x, y, z;
split(rt, x, y, pos - 1);
split(y, y, z, tot);
Cover(y, ci);
merge(x, y, x);
merge(x, z, rt);
} else if (opt[0] == 'R') {
int pos = read(), tot = read();
int x, y, z;
split(rt, x, y, pos - 1);
split(y, y, z, tot);
Reverse(y);
merge(x, y, y);
merge(y, z, rt);
} else if (opt[0] == 'G') {
int pos = read(), tot = read();
int x, y, z;
split(rt, x, y, pos - 1);
split(y, y, z, tot);
printf("%d\n", t[y].sum);
merge(x, y, y);
merge(y, z, rt);
} else if (opt[0] == 'M' && opt[2] == 'X') {
printf("%d\n", t[rt].zd);
}
}
return 0;
}
}signed main(){return yspm::main();}
FHQ treap板子的更多相关文章
- 在平衡树的海洋中畅游(四)——FHQ Treap
Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...
- 简析平衡树(四)——FHQ Treap
前言 好久没码过平衡树了! 这次在闪指导的指导下学会了\(FHQ\ Treap\),一方面是因为听说它可以可持久化,另一方面则是因为听说它是真的好写. 简介 \(FHQ\ Treap\),又称作非旋\ ...
- 【数据结构】FHQ Treap详解
FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的.FHQ Treap具有代码短,易理解,速度快的优点.(当然跟红黑树比一下就是 ...
- FHQ Treap 详解
鲜花 一些鲜花放在前面,平衡树学了很久,但是每学一遍都忘,原因就在于我只能 70% 理解 + 30% 背板子,所以每次都忘.这次我采取了截然不同的策略,自己按照自己的理解打一遍,大获成功(?),大概打 ...
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- 【POJ2761】【fhq treap】A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 15112 Solved: 4996[Submit][Statu ...
- 「FHQ Treap」学习笔记
话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
随机推荐
- C语言-字符类型
C语言-字符类型 char不仅是一种整数,也是一种特殊的类型:字符(character). 常用单引号表示字符的字面量,如'a', '1'. 单引号''也是一个字符,printf和scanf里用的%c ...
- pip2 install protobuf==2.6.1
[libprotobuf FATAL google/protobuf/stubs/common.cc:61] This program requires version 3.5.0 of the Pr ...
- json解析精度问题
由于后台传过来的值是float或者double类型,解析之后作为对象放到字典或数组里面,被转成nsstring或者nsnumber会有一定的误差,很正常 解决办法,通过NSNumberFormatte ...
- 快速幂(51Nod1046 A^B Mod C)
快速幂也是比较常用的,原理在下面用代码解释,我们先看题. 51Nod1046 A^B Mod C 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. In ...
- 关于Wasserstein GAN的一些笔记
这篇笔记基于上一篇<关于GAN的一些笔记>. 1 GAN的缺陷 由于 $P_G$ 和 $P_{data}$ 它们实际上是 high-dim space 中的 low-dim manifol ...
- Zxing和QR Code生成和解析二维码
本文是学习慕课网课程<Java生成二维码>(http://www.imooc.com/learn/531)的笔记. 一.二维码的分类 线性堆叠式二维码.矩阵式二维码.邮政码. 二.二维码的 ...
- 移动端H5开发遇到的问题及解决方法
本篇文章给大家带来的内容是关于移动端H5开发遇到的问题及解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 微信分享签名错误invalid signature vue单页应用hi ...
- mysql的常见面试问题
1.如何登陆mysql数据库 MySQL -u username -p 2.如何开启/关闭mysql服务 service mysql start/stop 3.查看mysql的状态 service m ...
- Express+MySQL实现图片上传到服务器并把路径保存到数据库中
demo准备:mysql5.7.20 express4.0 处理图片文件的中间件Multer 先搭建服务器并展示html页面 const express = require("express ...
- redis基本指令
1.键值相关命令 keys * 取出当前所有的key exists name 查看n是否有name这个key del name 删除key name e ...