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

5 3

1 3

1 3

1 4

Sample Output

4 3 2 1 5

HINT

N,M<=100000

Source

区间翻转,注意kth时和标记时下方标记,没了。
 #include <cstdio>
#include <iostream>
#define N 100100
using namespace std;
struct SplayNode
{
SplayNode *fa,*ch[];
SplayNode();
int data,num,size;
bool rev;
int chr() {return this==fa->ch[];}
void updata() {size=ch[]->size+ch[]->size+;}
void mark() {rev=rev^;}
void push()
{
if (rev)
{
rev=rev^;;
ch[]->mark();
ch[]->mark();
swap(ch[],ch[]);
}
}
}*null;
SplayNode::SplayNode() {fa=ch[]=ch[]=null; rev=; size=;}
int n,m;
int a[N];
namespace Splay
{
SplayNode *Root;
SplayNode *Build(int l,int r)
{
if (l>r) return null;
int mid=(l+r)>>;
SplayNode *R=new SplayNode;
R->data=a[mid];
R->ch[]=Build(l,mid-);
R->ch[]=Build(mid+,r);
R->ch[]->fa=R;
R->ch[]->fa=R;
R->updata();
return R;
}
void MakeTree()
{
null=new SplayNode;
*null=SplayNode();
Root=Build(,n);
}
void rotate(SplayNode *x)
{
SplayNode *r=x->fa;
if (r==null || x==null) return;
int t=x->chr();
r->ch[t]=x->ch[t^];
r->ch[t]->fa=r;
if (r->fa==null) Root=x;
else r->fa->ch[r->chr()]=x;
x->fa=r->fa;
x->ch[t^]=r;
r->fa=x;
x->updata();
r->updata();
}
void splay(SplayNode *x,SplayNode *y)
{
for (;x->fa!=y;rotate(x))
if (x->fa->fa!=y)
if (x->fa->chr()==x->chr()) rotate(x->fa);
else rotate(x);
}
SplayNode *Kth(int k)
{
SplayNode *r=Root;
if (k< || k>n) return null;
while (r!=null)
{
r->push();
if (k<=r->ch[]->size) r=r->ch[];
else if (k==r->ch[]->size+) return r;
else
{
k-=r->ch[]->size+;
r=r->ch[];
}
}
return null;
}
void reverse(int l,int r)
{
SplayNode *q=Kth(l-);
SplayNode *p=Kth(r+);
if (q==null && p==null)
{
Root->mark();
return;
}
if (q==null)
{
splay(p,null);
p->ch[]->mark();
return;
}
if (p==null)
{
splay(q,null);
q->ch[]->mark();
return;
}
q->push();
splay(q,null);
p->push();
splay(p,q);
p->ch[]->mark();
}
void dfs(SplayNode *x)
{
if (x==null) return;
x->push();
dfs(x->ch[]);
printf("%d ",x->data);
dfs(x->ch[]);
} }
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) a[i]=i;
Splay::MakeTree();
//Splay::dfs(Splay::Root);
// cout<<endl;
for (int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Splay::reverse(x,y);
// Splay::dfs(Splay::Root);
// cout<<endl;
}
Splay::dfs(Splay::Root);
return ;
}

【BZOJ3223】 Tyvj 1729 文艺平衡树 Splay的更多相关文章

  1. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  2. bzoj3223: Tyvj 1729 文艺平衡树 splay裸题

    splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...

  3. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

  4. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  5. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  6. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  7. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

  8. 【Splay】bzoj3223 Tyvj 1729 文艺平衡树

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...

  9. 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树

    让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...

随机推荐

  1. ckplayer视频播放插件使用

    研究ckplayer插件播放视频,播放视频需要配置信息修改如下: 1.设置ckplayer.js中的logo: 'null' 可以隐藏视频播放头部的图标: 2.设置ckplayer.js中的ckcpt ...

  2. centos安装oracle 11g 完全图解

    摘要: 说明: Linux服务器操作系统:CentOS 5.8 32位(注意:系统安装时请单独分区/data用来安装oracle数据库) Linux服务器IP地址:192.168.21.150 Ora ...

  3. 新手上路之Hibernate:第一个Hibernate例子

    一.Hibernate概述 (一)什么是Hibernate? Hibernate核心内容是ORM(关系对象模型).可以将对象自动的生成数据库中的信息,使得开发更加的面向对象.这样作为程序员就可以使用面 ...

  4. Multiple types were found that match the controller named 'Home'. (weird error)

    found the error, because I changed the namespace and assembly name, then on the bin folder the old d ...

  5. C# XML操作

    一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...

  6. android 入门-git之上传本地代码到github

    github部分: 1.首先去github网站 上注册一个用户 2.说明 https://guides.github.com/activities/hello-world/ 2.点击 New repo ...

  7. 轻松学习RSA加密算法原理

    转自:http://blog.csdn.net/sunmenggmail/article/details/11994013 http://blog.csdn.net/q376420785/articl ...

  8. javascript中的true和false

    今天遇到一个问题,执行下面的代码返回true还是false?请说明理由 console.log([] == ![]) 在浏览器中运行了一下,发现结果是true.为什么会这样呢?于是查找了相关的资料. ...

  9. jBox使用记录

    1.不显示底部按钮,可以将buttons设置为buttons:{} 例:$.jBox.open("iframe:http://www.baidu.com", "百度一下& ...

  10. Redis学习笔记(1) Redis介绍及基础

    1. Redis的特性 (1) 存储结构 Redis(Remote Dictionary Server,远程字典服务器)是以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容.Redis支 ...