文艺平衡树(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 n1≤l≤r≤n
输出格式
输出一行n个数字,表示原始序列经过m次变换后的结果
输入输出样例
输入 #1复制
5 3
1 3
1 3
1 4
输出 #1复制
4 3 2 1 5
说明/提示
n, m \leq 100000n,m≤100000
题目大意:就是给你一个区间,m次操作,每次反转一个区间,求最后区间的状态。
这道题虽然是splay的模板题,但是我们并不想用splay做(因为不会),于是我们可以考虑用无旋treap来做区间操作。
我们对无旋treap打上懒标记,每次记录一下即可。要注意每次split子树时,先传递懒标记,防止树被分裂之后,懒标记无法正确向下传递。
最后输出答案,一次dfs即可。
AC代码:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,m;
int ch[N][2],sz[N],val[N],pri[N],lazy[N],num,root,x,y,z;
inline void push_up(int p){sz[p]=sz[ch[p][0]]+sz[ch[p][1]]+1;
}
inline void push_down(int p){if(!lazy[p]) return ; swap(ch[p][0],ch[p][1]);lazy[ch[p][0]]^=1; lazy[ch[p][1]]^=1; lazy[p]=0;
}
inline int new_node(int v){sz[++num]=1; val[num]=v; pri[num]=rand(); return num;
}
void split(int now,int k,int &x,int &y){if(!now) return (void)(x=y=0);push_down(now);if(k<=sz[ch[now][0]]) y=now,split(ch[now][0],k,x,ch[now][0]);else x=now,split(ch[now][1],k-sz[ch[now][0]]-1,ch[now][1],y);push_up(now);
}
int merge(int x,int y){if(!x||!y) return x+y;push_down(x); push_down(y);if(pri[x]<pri[y]){ch[x][1]=merge(ch[x][1],y); push_up(x); return x;}else{ch[y][0]=merge(x,ch[y][0]); push_up(y); return y;}
}
inline void reverse(int l,int r){split(root,l-1,x,y); split(y,r-l+1,y,z);lazy[y]^=1; root=merge(merge(x,y),z);
}
void dfs(int x){if(!x) return ;push_down(x);dfs(ch[x][0]);printf("%d ",val[x]);dfs(ch[x][1]);
}
signed main(){srand((unsigned)time(NULL));scanf("%d %d",&n,&m);for(int i=1;i<=n;i++) root=merge(root,new_node(i)); while(m--){int l,r; scanf("%d %d",&l,&r); reverse(l,r);}dfs(root);puts("");return 0;
}
文艺平衡树(Splay)相关推荐
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6881 Solved: 4213 [Submit][S ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 文艺平衡树 Splay 学习笔记(1)
(这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. ...
- fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...
题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...
- 【Splay】文艺平衡树(金牌导航 Splay-2)
#文艺平衡树 金牌导航 Splay-2 题目大意 给你一个1~n的序列,然后对序列的区间做若干次翻转,问你最后的序列 输入样例 5 3 1 3 1 3 1 4 输出样例 4 3 2 1 5 数据范围 ...
- splay区间翻转(bzoj 3223: Tyvj 1729 文艺平衡树)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4854 Solved: 2844 [Submit][S ...
- [Tyvj 1729] 文艺平衡树
题面如下: Tyvj 1729 文艺平衡树 Time Limit: 1 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个有 ...
- 洛谷 P3391 【模板】文艺平衡树
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...
最新文章
- 在CentOS 6.8 x86_64上安装ATS 6.2.1实录
- 面试造飞机这么能耐,对着调优实战更不能怂啊!
- 如何在Python中反转列表?
- react router 路由守卫_react实现hash路由
- 中国无烟煤市场需求规模与未来发展形势分析报告2022版
- SpringSecurity 权限控制准备之IOC容器结构说明
- 学习nginx接口调用之摘录
- JS原型链中的属性问题
- Dubbo 高危漏洞!原来都是反序列化惹得祸
- MFC基于多文档框架(对话框内嵌office控件(word文档))
- python读取不到文件怎么办_Python从子目录中找不到的目录文件读取文件(在那里)...
- 关于计算机的知识古人,世界仅是一串二进制编码?我们是虚拟的?古人早就给出了答案...
- 统计学基础知识梳理,看这一篇就够了
- seaweedfs java_seaweedfs-java-client
- 我的k8s随笔:Kubernetes 1.17.0 部署讲解
- EXCEL表格将两列数据进行排列组合
- [转]C#中的global关键字(global::)
- C++ 游戏服务器开发有什么推荐的学习资料或者书籍?
- 政策解读│软件产业企业所得税优惠政策介绍(2022年版)
- 记一次 k8s 集群单点故障引发的血案