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 ...
随机推荐
- redis 命令大全
全局命令: 1.查看所有键:keys * 2.键总数:dbsize 3.检查键是否存在:exists key 4.删除键:del key [key ...] 5.键过期:expire key seco ...
- Windows 下 MySQL 备份脚本
@title MySQL备份脚本 @echo off @echo root@127.0.0.1:3306 set host=127.0.0.1 set port=3306 set user=root ...
- protocols - 协议定义文件
描述 该文件为普通 ASCII 文件,它描述了 TCP/IP 子系统中各类 DARPA internet 协议族.你应该参考这个文件, 而不是使用 ARPA 的 include 文件中的号码, 更不必 ...
- Nginx学习总结:proxy与rewrite模块(三)
斜体下划线,表示建议采用默认配置,无需显式的配置 一.ngx_http_upstream_module 此模块中可配置的指令并不是很多.nginx的负载均衡算法包括: 1)round-robin:轮询 ...
- Sass函数--列表函数append
append() 函数是用来将某个值插入到列表中,并且处于最末位. >> append(10px 20px ,30px) (10px 20px 30px) >> append( ...
- vue的列表交错过渡
参考文章 https://juejin.im/post/5cccf5b0e51d453a907b4af1
- 太可怕了!黑客是如何攻击劫持安卓用户的DNS?
最近发现的针对Android设备的广泛路由器的DNS劫持恶意软件现在已升级为针对iOS设备以及桌面用户的功能. 被称为RoamingMantis的恶意软件最初发现在上个月劫持了互联网路由器,以散布旨在 ...
- Web核心之会话技术Cookie&Session
什么是会话技术? http协议是无状态协议.为了满足在多次请求之间数据进行交互,推出了会话技术. 会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止.中间可能进行多 ...
- Vue学习笔记-组件通信-父传子(props中的驼峰标识)
在组件中,使用选项props来声明需要从父级接收到的数据.props的值有两种方式:方式一:字符串数组,数组中的字符串就是传递时的名称.方式二:对象,对象可以设置传递时的类型,也可以设置默认值等. & ...
- 汇编 “ program has no starting address ”解决方法