文艺平衡树(区间splay)
Description
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列。
其中需要提供以下操作:翻转一个区间,例如原有序序列是 5\ 4\ 3\ 2\ 15 4 3 2 1,翻转区间是 [2,4][2,4] 的话,结果是 5\ 2\ 3\ 4\ 15 2 3 4 1。
输入格式
第一行两个正整数 n,mn,m,表示序列长度与操作个数。序列中第 ii 项初始为 ii。
接下来 mm 行,每行两个正整数 l,rl,r,表示翻转的区间。
输出格式
输出一行 nn 个正整数,表示原始序列经过 mm 次变换后的结果。
Code
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N=,inf=;
int sum,n,root,m,l,r,d[N],fa[N],size[N],s[N][],v[N],tag[N];
inline int which(int x)
{
return x==s[fa[x]][]?:;
}
inline void push_up(int g)
{
if(g){
size[g]=;
if(s[g][]) size[g]+=size[s[g][]];
if(s[g][]) size[g]+=size[s[g][]];
}
}
void built(int l,int r,int &g)
{
if(l>r) return ;
g=++sum;
size[g]=;
int mid=(l+r)>>;
v[g]=d[mid];
built(l,mid-,s[g][]);
built(mid+,r,s[g][]);
fa[s[g][]]=fa[s[g][]]=g;
push_up(g);
}
inline void push_down(int g)
{
if(g && tag[g]){
tag[s[g][]]^=,tag[s[g][]]^=;
swap(s[g][],s[g][]),tag[g]=;
}
}
inline int find(int x)
{
int now=root;
while()
{
push_down(now);
if(size[s[now][]]>=x) now=s[now][];
else
{
x-=size[s[now][]]+;
if(x>) now=s[now][];
else return now;
}
}
}
inline void rotate(int x)
{
int f=fa[x],oldf=fa[f];
push_down(f),push_down(x);
int w=which(x),ww=which(f);
s[f][w]=s[x][w^];
fa[s[x][w^]]=f;
fa[f]=x,fa[x]=oldf;
s[x][w^]=f;
if(oldf) s[oldf][s[oldf][]==f]=x;
push_up(f),push_up(x);
}
inline void splay(int x,int g)
{
for(int i;(i=fa[x])!=g;rotate(x))
if(fa[i]!=g) rotate(which(i)==which(x)?i:x);
if(g==) root=x;
}
inline void re(int l,int r)
{
l=find(l-),r=find(r+);
splay(l,),splay(r,l);
int pos=s[s[root][]][];
tag[pos]^=;
}
void dfs(int x)
{
push_down(x);
if(s[x][]) dfs(s[x][]);
if(v[x]!=-inf && v[x]!=inf) printf("%d ",v[x]);
if(s[x][]) dfs(s[x][]);
}
int main()
{
scanf("%d%d",&n,&m);
d[]=-inf,d[n+]=inf;
for(int i=;i<=n;i++) d[i+]=i;
built(,n+,root);
for(int i=;i<m;i++)
{
scanf("%d%d",&l,&r);
re(l+,r+);
}
dfs(root);
return ;
}
文艺平衡树(区间splay)的更多相关文章
- P3391 【模板】文艺平衡树(Splay)新板子
P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...
- fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)
题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- 洛谷 P3391 【模板】文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 洛谷 P3391【模板】文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- P3391 文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 普通平衡树与文艺平衡树的splay代码
主要综合借鉴了yyb和马前卒两位大佬的. //普通平衡树 #include <cstdio> #include <cctype> #include <cstring> ...
- 【模板】文艺平衡树(Splay) 区间翻转 BZOJ 3223
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 N,M<= ...
随机推荐
- buerdepepeqi 的模版
buerdepepeqi的模板 头文件 #include <set> #include <map> #include <deque> #include <qu ...
- SQL常见命令
SQLite常见命令:https://www.cnblogs.com/senior-engineer/p/7028972.html
- #mysql查询特定数据库中的所有表名
#mysql查询特定数据库中的所有表名select table_namefrom information_schema.tableswhere table_schema='smbms' and tab ...
- numpy :: 计算特征之间的余弦距离
余弦距离在计算相似度的应用中经常使用,比如: 文本相似度检索 人脸识别检索 相似图片检索 原理简述 下面是余弦相似度的计算公式(图来自wikipedia): 但是,余弦相似度和常用的欧式距离的有所区别 ...
- QTableView 控件的简单使用
QTableView类提供了一个表视图的默认模型/视图实现. 一个QTableView实现一个表视图,它显示来自一个模型的项目.这个类用于提供以前由QTable类提供的标准表,但是使用Qt的模型/视图 ...
- 【题解】Vijos1404 遭遇战(最短路图论套路)
[题解]Vijos1404 遭遇战(最短路图论套路) 感觉一定要有建模的思想,不管什么东西要抽象建模之后再用算法解决... 求最短代价就可能可以用最短路,这句话不是强行解释,而是因为图论建模过后,可能 ...
- d3.js制作条形时间范围选择器
此文章为原创文章,原文地址:https://www.cnblogs.com/eagle1098/p/12146688.html 效果如上图所示. 本项目使用主要d3.js v4制作,可以用来选择两年的 ...
- [Oracle]Oracle的闪回归档
Oracle的闪回归档 场景需求,由于管理数据库的一些核心表,在实施初期会有人为误删除的问题.Oracle 11gR2提供了闪回归档的特性,可以保证不用RMAN来恢复误删除的数据.实践如下: 1.创建 ...
- DNS服务器红帽5.4搭建图文教程!!!
DNS服务器 挂载光盘 mount 查看光盘所在位置 mount -t iso9660 设备目录 /mnt 表示挂载 软件包安装 所有软件包都在Server目录下 rpm -ivh /mnt/Serv ...
- Javascript小白经典题型(一)
1. 输出是什么? function sayHi() { console.log(name) console.log(age) var name = 'Lydia' let age = 21 } sa ...