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) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
随机推荐
- 将本地项目映射到外网(tomcat web项目)
1.首先如上图下载nat123软件,该软件可以免费内网映射. 2.根据上面图片,按要求填写即可:内网端口:自己web服务对应端口,内网地址:本机地址可以使默认localhost,内网ip,其余默认即可 ...
- linux下的hashpump安装及使用
hashpump是linux上的一个进行hash长度拓展攻击的工具,安装过程如下: git clone https://github.com/bwall/HashPump apt-get instal ...
- 深入理解Canvas Scaler
Canvas Scaler: 这是一个理解起来相当繁琐复杂的一个组件,但又是一个至关重要的组件,不彻底了解它,可以说对UGUI的布局和所谓的“自适应”就没有一个完整的认识. Canvas Scale指 ...
- 2020PHP面试-Redis篇
一.Redis 数据类型 1. string 字符型. 2.hash hash 结构化的对象. key不可重复 3.list 队列 lpush rpop lpop rpush 4. set 集 ...
- POJ 3126:Prime Path
Prime Path Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit St ...
- fastreport小入门
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 在excel中评估模型性能
一直在用的结果, 从代码中整理出来. 评分卡模型的结果一般在excel中即可计算完成. 下面是在number中计算评分卡模型的性能(KS/AUC), 表格中百分数省略%
- Linux相关笔记
vim下 r /etc/hosts 会把这个文件读进来 r! df -Th 会把执行的内容读取进来 查找 / ? 替换:s/old/new/g 2到9行替换2,9s/old/new/g 全部替换 ...
- [Java-基础]反射_Class对象_动态操作
动态性 动态语言 在程序运行时,可以改变程序结构或变量类型,典型的语言: Python,ruby,javascript 如: function test(){ var s = "var a= ...
- Excel Old format or invalid type library 错误原因
Old format or invalid type library 错误原因 调用excel方法失败,Old format or invalid type library 解决方案: 1,这是Exc ...