P3391 文艺平衡树(Splay)
题目背景
这是一道经典的Splay模板题——文艺平衡树。
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
输入格式:
第一行为n,m n表示初始序列有n个数,这个序列依次是 (1,2, \cdots n-1,n)(1,2,⋯n−1,n) m表示翻转操作次数
接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r \leq n 1≤l≤r≤n
输出格式:
输出一行n个数字,表示原始序列经过m次变换后的结果
输入样例#1:
5 3
1 3
1 3
1 4
输出样例#1:
4 3 2 1 5
说明
n,m≤100000
我就想水一篇,你要咋地QAQ?
```c++
include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, L = 0, R = 1;
struct lpl{
int data, size, tag, fa, son[2];
}node[maxn];
int n, m, cnt, root;
namespace Splay{
inline void pushdown(int t)
{
if(!node[t].tag) return; node[t].tag = 0;
swap(node[t].son[L], node[t].son[R]);
node[node[t].son[L]].tag ^= 1; node[node[t].son[R]].tag ^= 1;
}
inline void update(int t){node[t].size = node[node[t].son[L]].size + node[node[t].son[R]].size + 1;}
inline void rotate(int t)
{
int fa = node[t].fa, grdfa = node[fa].fa, which = (node[fa].son[R] == t);
node[grdfa].son[node[grdfa].son[R] == fa] = t; node[t].fa = grdfa;
node[node[t].son[which ^ 1]].fa = fa;
node[fa].son[which] = node[t].son[which ^ 1];
node[t].son[which ^ 1] = fa; node[fa].fa = t;
update(fa); update(t);
}
inline void splay(int t, int k)
{
while(node[t].fa != k){
int fa = node[t].fa, grdfa = node[fa].fa;
if(grdfa != k){
if((node[fa].son[R] == t) ^ (node[grdfa].son[R] == fa)) rotate(t);
else rotate(fa);
}
rotate(t);
}
if(!k) root = t;
}
inline void insert(int t)
{
int now = root, fa = 0;
while(now){
fa = now;
if(node[now].data < t) now = node[now].son[R];
else now = node[now].son[L];
}
node[fa].son[t > node[fa].data] = ++cnt; node[cnt].data = t;
node[cnt].fa = fa; node[cnt].size = 1;
splay(cnt, 0);
}
int Find(int t, int k)
{
pushdown(t);
if(k == node[node[t].son[L]].size + 1) return t;
if(k <= node[node[t].son[L]].size) return Find(node[t].son[L], k);
return Find(node[t].son[R], k - (node[node[t].son[L]].size + 1));
}
void print(int t)
{
pushdown(t);
if(node[t].son[L]) print(node[t].son[L]);
if(2 <= node[t].data && node[t].data <= n + 1) printf("%d ", node[t].data - 1);
if(node[t].son[R]) print(node[t].son[R]);
}
}
inline void workk(int l, int r)
{
int LL, RR;
LL = Splay::Find(root, l - 1), RR = Splay::Find(root, r + 1);
Splay::splay(LL, 0);
Splay::splay(RR, LL);
node[node[node[root].son[R]].son[L]].tag ^= 1;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n + 2; ++i) Splay::insert(i);
while(m--){
int l, r;
scanf("%d%d", &l, &r); l++; r++;
workk(l, r);
}
Splay::print(root);
return 0;
}
P3391 文艺平衡树(Splay)的更多相关文章
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- [luogu P3391] 文艺平衡树
[luogu 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 ...
- Tyvj P1729 文艺平衡树 Splay
题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
- BZOJ3223/洛谷P3391 - 文艺平衡树
BZOJ链接 洛谷链接 题意 模板题啦~2 代码 //文艺平衡树 #include <cstdio> #include <algorithm> using namespace ...
- bzoj3223Tyvj 1729 文艺平衡树 splay
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5644 Solved: 3362[Submit][Sta ...
随机推荐
- python中单下划线(_)和双下划线(__)的特殊用法
单下划线开头(_) 在模块中使用单下划线开头 模块中使用单下划线(_)开头定义函数.全局变量和类不能被模块外部以: from module import *形式导入. 但可以用:from module ...
- JVM分为哪些区,每一个区干嘛的?
程序计数器PC 线程私有的 它可以看做是当前线程所执行的字节码的行号指示器 内存区域中唯一一个没有规定任何OutOfMemoryError的区域 Java虚拟机栈 线程私有的 每个方法在执行的同时都会 ...
- 《TED演讲的秘密》:TED组织者总结的演讲技巧集锦。三星推荐。
对演讲感兴趣的可以看看.对TED内容感兴趣的也可以翻翻,书中有不少作者认为演讲技巧比较经典(一般来说内容上也有特色)的TED演讲的二维码.三星推荐.http://t.cn/RvFStu7
- 【LeetCode】深搜DFS(共85题)
[98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...
- 学会如何使用shiro
摘:https://www.cnblogs.com/learnhow/p/5694876.html 一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙.S ...
- HTML5 绘制阴影
代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8 ...
- 【leetcode】636. Exclusive Time of Functions
题目如下: 解题思路:本题和括号匹配问题有点像,用栈比较适合.一个元素入栈前,如果自己的状态是“start”,则直接入栈:如果是end则判断和栈顶的元素是否id相同并且状态是“start”,如果满足这 ...
- Java基本数据类型及所占字节大小
一.Java基本数据类型 基本数据类型有8种:byte.short.int.long.float.double.boolean.char 分为4类:整数型.浮点型.布尔型.字符型. 整数型:byte. ...
- Angular JS - 7 - Angular JS 常用指令2
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Java Web学习总结(10)学习总结-EL表达式
一,EL 表达式概述(EL主要从域中取数据) EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 二,EL从域中 ...