感觉这个玩意就是拆来拆去,所以没啥可学习的

粘一下两个题的代码吧

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板子的更多相关文章

  1. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  2. 简析平衡树(四)——FHQ Treap

    前言 好久没码过平衡树了! 这次在闪指导的指导下学会了\(FHQ\ Treap\),一方面是因为听说它可以可持久化,另一方面则是因为听说它是真的好写. 简介 \(FHQ\ Treap\),又称作非旋\ ...

  3. 【数据结构】FHQ Treap详解

    FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的.FHQ Treap具有代码短,易理解,速度快的优点.(当然跟红黑树比一下就是 ...

  4. FHQ Treap 详解

    鲜花 一些鲜花放在前面,平衡树学了很久,但是每学一遍都忘,原因就在于我只能 70% 理解 + 30% 背板子,所以每次都忘.这次我采取了截然不同的策略,自己按照自己的理解打一遍,大获成功(?),大概打 ...

  5. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  6. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  7. 【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 ...

  8. 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 15112  Solved: 4996[Submit][Statu ...

  9. 「FHQ Treap」学习笔记

    话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...

随机推荐

  1. cf 609E.Minimum spanning tree for each edge

    最小生成树,lca(树链剖分(太难搞,不会写)) 问存在这条边的最小生成树,2种情况.1.这条边在原始最小生成树上.2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去).( ...

  2. 实验吧web-难-认真一点!(布尔盲注,py脚本)

    也可用bp进行爆破,这里用py脚本. 打看网页输入1,显示You are in,输入2,显示You are not in,是个布尔注入. 然后看看过滤了什么. sql注入没有过滤:--+.or sql ...

  3. MySQL的异常问题

    异常问题

  4. scala def方法时等号和括号使用说明笔记

    scala定义方法时会指定入参和返回类型(无返回类型时对应Unit,即java和C中的void模式). 1.有入参,有返回类型时,scala具有类型推导功能,以下两种表达方式效果一样.但根据scala ...

  5. linux 下shell 编写脚本

    linux 下shell 编写脚本: 1.程序结构练习:编写一个脚本,给定一个正整数,计算出这个数所有位的数字之和. 例如:程序给定输入123,那么应该返回1+2+3=6. 2.程序结构练习:编写一个 ...

  6. 在excel中评估模型性能

    一直在用的结果, 从代码中整理出来. 评分卡模型的结果一般在excel中即可计算完成. 下面是在number中计算评分卡模型的性能(KS/AUC), 表格中百分数省略%

  7. MySQL性能管理及架构设计:第2章 什么影响了MySQL性能

    第2章 什么影响了MySQL性能 2-1 影响性能的几个方面 1.服务器的硬件 2.服务器的操作系统 3.数据库的存储引擎 4.数据库的参数配置 5.数据库表结构设计和SQL语句的编写和优化 2-2 ...

  8. 寒假day15

    今天完成了毕设的人才动态模块,同时刷了计算机网络的相关面试题

  9. 自动生成返回Json数据的toString()方法

    平时书写实体类方法的时候,想要获取的值直接返回Json字符串,以便使用,可以直接在Eclipse里面生成. 实现步骤: 1.快捷键Alt+S 2.选择Edit 3.添加字段,名称随意(我的为JsonS ...

  10. Linux下idea由于缺少相关权限导致的tomcat ERROR

    昨天一天都在倒腾两个系统,也是醉了. 不过还好,系统修好了,在ubuntu下重新安装idea后,出现了这个错误: Intellij Idea Tmocat Error running Tomcat: ...