[luogu3391][bzoj3223]文艺平衡树【splay】
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
分析
不懂splay可以看一下我的博客:【传送门】
这道题目就是用splay来实现区间反转的,这个东西听说好像是LCT用splay的原因,我也不清楚没有学过LCT。
很明显,我们这道题目维护的不是权值,而是区间的编号(虽然好像还是权值),那么翻转操作就是交换两个子树的儿子的关系,但是如果每一次都暴力翻转\(O(mlog^2n)\),就做一个懒标记。
如果一个区间被旋转了两次,那么很明显,这个区间又变回去了,那么我们就维护一个标记表示表示以下的区间是否被翻转过。
那么剩下来的答案其实就是二叉查找树的中序遍历(BST的性质)。
ac代码
#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define N 100005
using namespace std;
template <typename T>
inline void read(T &x) {
x = 0; T fl = 1;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-') fl = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= fl;
}
struct Splay {
int rt, tot;
struct node {
int ch[2], fa, val, sz, fg;
void init(int nod, int ft) {
fa = ft;
ch[0] = ch[1] = 0;
sz = 1;
val = nod;
}
}tr[N << 1];
Splay() {
ms(tr, 0);
rt = tot = 0;
}
void pushup(int nod) {
tr[nod].sz = tr[tr[nod].ch[0]].sz + tr[tr[nod].ch[1]].sz + 1;
}
void pushdown(int nod) {
if (!tr[nod].fg) return;
tr[tr[nod].ch[0]].fg ^= 1;
tr[tr[nod].ch[1]].fg ^= 1;
tr[nod].fg = 0;
swap(tr[nod].ch[0], tr[nod].ch[1]);
}
void rotate(int nod) {
int fa = tr[nod].fa, gf = tr[fa].fa, k = tr[fa].ch[1] == nod;
tr[gf].ch[tr[gf].ch[1] == fa] = nod;
tr[nod].fa = gf;
tr[fa].ch[k] = tr[nod].ch[k ^ 1];
tr[tr[nod].ch[k ^ 1]].fa = fa;
tr[nod].ch[k ^ 1] = fa;
tr[fa].fa = nod;
pushup(fa);
pushup(nod);
}
void splay(int nod, int goal) {
while (tr[nod].fa != goal) {
int fa = tr[nod].fa, gf = tr[fa].fa;
if (gf != goal) {
if ((tr[gf].ch[0] == fa) ^ (tr[fa].ch[0] == nod)) rotate(nod);
else rotate(fa);
}
rotate(nod);
}
if (goal == 0) rt = nod;
}
int kth(int k) {
int u = rt;
while (1) {
pushdown(u);
int lc = tr[u].ch[0];
if (tr[lc].sz >= k) u = lc;
else if (tr[lc].sz + 1 == k) return u;
else k -= tr[lc].sz + 1, u = tr[u].ch[1];
}
}
void insert(int x) {
int u = rt, ft = 0;
while (u) {
ft = u;
u = tr[u].ch[x > tr[u].val];
}
u = ++ tot;
if (ft) tr[ft].ch[x > tr[ft].val] = u;
tr[u].init(x, ft);
splay(u, 0);
}
void solve(int l, int r) {
l = kth(l);
r = kth(r + 2);
splay(l, 0);
splay(r, l);
tr[tr[tr[rt].ch[1]].ch[0]].fg ^= 1;
}
}splay;
int n, m;
void dfs(int nod) {
splay.pushdown(nod);
if (splay.tr[nod].ch[0]) dfs(splay.tr[nod].ch[0]);
if (splay.tr[nod].val >= 2 && splay.tr[nod].val <= n + 1) printf("%d ", splay.tr[nod].val - 1);
if (splay.tr[nod].ch[1]) dfs(splay.tr[nod].ch[1]);
}
int main() {
read(n); read(m);
for (int i = 1; i <= n + 2; i ++) splay.insert(i);
while (m --) {
int l, r;
read(l); read(r);
splay.solve(l, r);
}
dfs(splay.rt);
return 0;
}
[luogu3391][bzoj3223]文艺平衡树【splay】的更多相关文章
- BZOJ3223 文艺平衡树(splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树
http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...
- [bzoj3223]文艺平衡树(splay区间反转模板)
解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...
- [bzoj3223]文艺平衡树——splay
题意 你应当编写一个数据结构,支持以下操作: 反转一个区间 题解 我们把在数组中的位置当作权值,这样原序列就在这种权值意义下有序,我们考虑使用splay维护. 对于操作rev[l,r],我们首先把l- ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- bzoj3223 文艺平衡树 (treap or splay分裂+合并)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3313 Solved: 1883 [Submit][S ...
- Tyvj P1729 文艺平衡树 Splay
题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...
随机推荐
- HTTP协议,Http 常用状态码
一.HTTP协议-Request HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. 1.1 HTTP请求报 ...
- Python_面向对象基础
概念 类 一类抽象的事物,是描述了一类事物有哪些属性或者行为,但不是具体——模子. 实例 一个依托于类的规范存在的,被赋予了具体属性值的实际存在的物体. 对象 就是实例,实例的另外一个名称,相当于别名 ...
- Python_动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal
1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1( ...
- js总结:增加和减少文本框
<head><script>var count = 0; function add(){ if(count<3) { count++; var x= document.c ...
- MySQL的视图总结
使用下面格式创建视图: create or replace view viewName as select ..... from ...... where .... 删除视图: drop view v ...
- 解决ERR Client sent AUTH, but no password is set
在搭建cookies池时,需要将账号密码保存到redis,保存时报错:ERR Client sent AUTH, but no password is set 报错原因:Redis服务器没有设置密码, ...
- CentOS 7 安装配置带用户认证的squid代理服务器
这里只简述搭建一个带用户认证的普通代理 一.安装 安装过程十分简便,只需要安装一下squid,一条命令搞定 yum install squid rpm -qa | grep squid squid-- ...
- [编程笔记]第一章 C语言概述
//C语言学习笔记 第一讲 C语言概述 第二讲 基本编程知识 第三讲 运算符和表达式 第四讲 流程控制 第五讲 函数 第六讲 数组 第七讲 指针 第八讲 变量的作用域和存储方式 第九讲 拓展类型 第十 ...
- nodejs配置nginx 以后链接mongodb数据库
服务器 :windows server2008 R2 反向代理 :nginx 1.15.1 for window 64位 数据库:mongodb 4 64位 使用框架express 首先下载nodej ...
- 理解ORM的前提:数据库中的范式和约束
理解ORM的前提:数据库中的范式和约束 一.数据库中的范式: 范式, 英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出 ...