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) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
随机推荐
- sqlserver 联接查询的一些注意点
1.内连接的安全性 (1) inner join 是ANSI SQL-92 语法.等值联接是ANSI SQL-89 的语法 ,两者已相同方式解释.在性能上没有差别 (2)但是强烈建议使用ANSI SQ ...
- unique constraint(PD.HSI_RIGHT) violated
插入时报错,原因:唯一约束重复了.... 查看表中有唯一约束的列是不是已经有值了 果然,唯一约束有两条重复的记录. ------------------------------------------ ...
- mybatis环境搭建(eclipse,idea)
基于java配置SSM,eclipse 新建maven,web项目 .... 项目结构: jar包 pom.xml spring和DispatcherServlet上下文 public class D ...
- RecyclerView使用介绍
来源 http://jinyudong.com/2014/11/13/Introduce-RecyclerView-%E4%B8%80/ 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在 ...
- Maven - 构建生命周期、阶段、目标
版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...
- 寒假day26
根据已有数据爬取新数据充实人才库
- ADO多线程数据库查询
{ADO查询多线程单元} unit ADOThread; interface uses Classes,StdCtrls,ADODB; type TADOThread = class(TThread) ...
- 新浪SAE云平台下使用codeigniter的数据库配置
新浪SAE云平台下使用codeigniter的数据库配置 投稿:shichen2014 字体:[增加 减小] 类型:转载 这篇文章主要介绍了新浪SAE云平台下使用codeigniter的数据库配置,主 ...
- UVALive 4670 AC自动机
第二道AC自动机的题目了,之前参考的是网上一个博客算法,不怎么好,难写而且占空间 后来参照大白书做的这题,代码简洁多了 #include <iostream> #include <c ...
- [Java-基础] 什么是ORM
ORM简介 ORM:对象关系映射:Object Relational Mapping 用于实现面向对象编程语言里不同类型系统的数据之间的转换 一般的,数据库绝大部分是面向关系的数据库,但是写代码的 ...