bzoj3223 文艺平衡树 (treap or splay分裂+合并)
3223: Tyvj 1729 文艺平衡树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 3313 Solved: 1883
[Submit][Status][Discuss]
Description
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
Input
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
Output
输出一行n个数字,表示原始序列经过m次变换后的结果
Sample Input
1 3
1 3
1 4
Sample Output
HINT
N,M<=100000
Source
RunID
User | Problem | Result | Memory | Time | Language | Code_Length | Submit_Time | |
1538282 | ksq2013 | 3223 | Accepted | 5396 kb | 2576 ms | C++/Edit | 2878 B | 2016-07-08 20:57:17 |
区间翻转裸题,废话不多说,直接放代码:
#include<cstdio>
#include<iostream>
#define INF 0x3f3f3f3f
#define Key_value ch[ch[root][1]][0]
using namespace std;
bool rev[];
int n,m,root,tot,size[],key[],pre[],ch[][];
void NewNode(int &x,int father,int val)
{
x=++tot;
size[x]=;
key[x]=val;
pre[x]=father;
}
void Update_Rev(int x)
{
rev[x]^=;
swap(ch[x][],ch[x][]);
}
void Push_Up(int x)
{
size[x]=size[ch[x][]]+size[ch[x][]]+;
}
void Push_Down(int x)
{
if(rev[x]){
Update_Rev(ch[x][]);
Update_Rev(ch[x][]);
rev[x]=;
}
}
void build(int &x,int father,int l,int r)
{
if(l>r)return;
int mid=(l+r)>>;
NewNode(x,father,mid);
build(ch[x][],x,l,mid-);
build(ch[x][],x,mid+,r);
Push_Up(x);
}
void Init()
{
NewNode(root,,INF);
NewNode(ch[root][],root,INF);
build(Key_value,ch[root][],,n);
}
int Get_Kth(int x,int k)
{
Push_Down(x);//mistaken codes;
int t=size[ch[x][]]+;
if(t==k)return x;
if(t>k)return Get_Kth(ch[x][],k);
return Get_Kth(ch[x][],k-t);
}
void Rotate(int x,int kind)
{
int y=pre[x];
Push_Down(y);Push_Down(x);
ch[y][!kind]=ch[x][kind];
pre[ch[x][kind]]=y;
if(pre[y])ch[pre[y]][ch[pre[y]][]==y]=x;//unfixed;
pre[x]=pre[y];
ch[x][kind]=y;
pre[y]=x;
Push_Up(y);
}
void Splay(int x,int goal)
{
Push_Down(x);
while(pre[x]!=goal){
if(pre[pre[x]]==goal){
Push_Down(pre[x]);
Push_Down(x);
Rotate(x,ch[pre[x]][]==x);
}
else{
int y=pre[x];
int kind=ch[pre[y]][]==y;
Push_Down(pre[y]);//mistaken codes&&一遇到向下的操作就Push_Down;
Push_Down(y);//mistaken codes
Push_Down(x);//mistaken codes
if(ch[y][kind]==x){
Rotate(x,!kind);
Rotate(x,kind);
}
else{
Rotate(y,kind);
Rotate(x,kind);
}
}
}
Push_Up(x);
if(goal==)root=x;
}
void Rev(int l,int r)
{
Splay(Get_Kth(root,l),);
Splay(Get_Kth(root,r+),root);
Update_Rev(Key_value);
Push_Up(ch[root][]);
Push_Up(root);
}
void dfs(int x)
{
if(!x)return;
Push_Down(x);
dfs(ch[x][]);
if(<=key[x]&&key[x]<=n)printf("%d ",key[x]);
dfs(ch[x][]);
}
int main()
{
scanf("%d%d",&n,&m);
Init();
for(int x,y;m;m--){
scanf("%d%d",&x,&y);
Rev(x,y);
}dfs(root);
return ;
}
新splay模板上线,更简洁
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
inline int Rin(){
int x=,c=getchar(),f=;
for(;c<||c>;c=getchar())
if(!(c^))f=-;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
return x*f;
}
struct node{
node*ch[];
int r,s,v;bool b;
node (int v,node*k):v(v){
r=rand();
b=;s=;
ch[]=ch[]=k;
}
void exc(node*&x,node*&y)
{node*k=y;y=x;x=k;}
void pu(){s=ch[]->s+ch[]->s+;}
void pd(){
if(b){
b=;
exc(ch[],ch[]);
ch[]->b^=;
ch[]->b^=;
}
}
}*rt,*bf;
inline void rot(node*&o,int d){
node*k=o->ch[d^];o->ch[d^]=k->ch[d];k->ch[d]=o;
o->pu();k->pu();o=k;
}
inline int cmk(node*o,int k){
if(o->ch[]->s+==k)return -;
if(o->ch[]->s>=k)return ;
return ;
}
inline void ins(node*&o,int x){
if(o==bf){o=new node(x,bf);return;}
ins(o->ch[],x);
o->ch[]->r>o->r?rot(o,):o->pu();
}
inline void splay(node*&o,int k){
if(o==bf)return;
o->pd();int d=cmk(o,k);
if(!(d^))k-=o->ch[]->s+;
if(d!=-&&o->ch[d]!=bf){
node*p=o->ch[d];p->pd();
int dd=cmk(p,k);
if(dd!=-&&p->ch[dd]!=bf){
int kk=(dd?k-p->ch[]->s-:k);
splay(p->ch[dd],kk);
d^dd?rot(o->ch[d],d):rot(o,d^);
}
rot(o,d^);
}
}
inline node*mrg(node*l,node*r){
splay(l,l->s);l->ch[]=r;
l->pu();return l;
}
inline void slt(node*o,int k,node*&l,node*&r){
if(!k){l=bf;r=o;return;}
if(!(k^o->s)){l=o;r=bf;return;}
splay(o,k);l=o;r=o->ch[];
o->ch[]=bf;l->pu();
}
inline void ini(){
bf=new node(,);
bf->r=INT_MAX;bf->s=bf->v=;
bf->ch[]=bf->ch[]=bf;rt=bf;
ins(rt,);rt->r=-;
}
void opt(node*o){
if(o==bf)return;
o->pd();
opt(o->ch[]);
if(o->r!=-)printf("%d ",o->v);
opt(o->ch[]);
}
int n,m;
int main(){
n=Rin(),m=Rin();ini();
for(int i=;i<=n;i++)ins(rt,i);
while(m--){
int l=Rin(),r=Rin();
node *ll,*rr,*mm;
slt(rt,l,ll,rr);
slt(rr,r-l+,mm,rr);
mm->b^=;
rt=mrg(mrg(ll,mm),rr);
}
opt(rt);
return ;
}
bzoj3223 文艺平衡树 (treap or splay分裂+合并)的更多相关文章
- BZOJ3223文艺平衡树——非旋转treap
此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
- BZOJ3223 文艺平衡树(splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 【模板】平衡树——Treap和Splay
二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...
- 文艺平衡树(区间splay)
文艺平衡树(luogu) Description 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列. 其中需要提供以下操作:翻转一个区间,例如原有序序列是 5\ 4\ 3\ 2\ ...
- JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树
http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...
- [luogu3391][bzoj3223]文艺平衡树【splay】
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 分析 ...
- [bzoj3223]文艺平衡树(splay区间反转模板)
解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...
- [bzoj3223]文艺平衡树——splay
题意 你应当编写一个数据结构,支持以下操作: 反转一个区间 题解 我们把在数组中的位置当作权值,这样原序列就在这种权值意义下有序,我们考虑使用splay维护. 对于操作rev[l,r],我们首先把l- ...
随机推荐
- Java笔试题(一)
一. 选择题(共50题,每题2分,共100分.多选题选不全或选错都不得分.) 7. 以下说法错误的是()/*这个我感觉是全对,谁知道哪个错啦,讲解下,非常感谢*/A) super.方法()可以调用父类 ...
- 通知 - NSNotificationCenter
1.每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信: 2.任何一个对象都可以向通知中心发布通知(NSNotification), 描 ...
- 限制EditText 输入的字节数
1.代码 name_tv = (EditText) findViewById( R.id.name_tv ); name_tv.addTextChangedListener(new TextWatch ...
- 使用imeOptions
Android的软键盘右下角有Action按钮,如下图的“上一步” 在EditText中有 android:imeOptions选项,它包括完成按钮“actionDone”,发送按钮“actionSe ...
- 防止IOS6与IOS7图标不一致
点击AppIcon在属性栏内找到iOS icon is pre-rendered打上勾. 如果之前已经安装过,需要先把APP卸载掉再安装.(因为模拟器有缓存) xcode4版本的话需要在INFO内增加 ...
- iOS 自定义的对象类型的解档和归档
自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...
- iOS-H5学习篇-01
什么是HTML? HTML 是用来描述网页的一种语言. 0.HTML 指的是超文本标记语言 1.HTML 不是一种编程语言,而是一种标记语言 2.标记语言是一套标记标签 3.HTML 使用标记标签来描 ...
- iOS PushMeBaby日志提示SSLwrite():-36 94
在测试远程推送时用PushMeBaby来模拟服务器发推送消息 但是点击push按钮后手机没有收到推送消息,多点击几下后程序就崩了,强行运行后日志输出了 SSLwrite():-36 94这句话 出现这 ...
- 直接双击启动tomcat中的startup.bat闪退原因及解决方法
免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...
- 同步时间linux
针对对时间要求精确度高的服务器 1.安装时间服务器yum install ntp 2.同步时间ntpdate time.nist.gov 3.设置计划任务每隔10分钟同步一次 */10 * * * * ...