【BZOJ3223】 Tyvj 1729 文艺平衡树 Splay
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
#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的更多相关文章
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- bzoj3223: Tyvj 1729 文艺平衡树 splay裸题
splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
- bzoj 3223: Tyvj 1729 文艺平衡树 (splay)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
- 【Splay】bzoj3223 Tyvj 1729 文艺平衡树
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...
- 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树
让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...
随机推荐
- 重温WCF之消息契约(MessageContract)(六)
对于SOAP来说主要由两部分构成Header和Body,他们两个共同构成了SOAP的信封,通常来说Body保存具体的数据内容,Header保存一些上下文信息或关键信息.比如:在一些情况下,具有这样的要 ...
- 【翻译二】java--并发之进程与线程
Processes and Threads In concurrent programming, there are two basic units of execution: processes a ...
- tkprof工具详解二(一些实例)
TKPROF是一个可执行文件,自带在Oracle Server软件中,无需额外的安装. 该工具文件可以用来解析ORACLE的SQL TRACE(10046) 以便生成更可读的内容. 实际上tkpro ...
- Java后端WebSocket的Tomcat实现
转自:http://blog.chenzuhuang.com/archive/28.html 文章摘要随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5 ...
- virtualbox无法安装VBoxLinuxAdditions.run
执行 sh ./VBoxLinuxAdditions.run 命令后报错 ./VBoxLinuxAdditions.run: ./VBoxLinuxAdditions.run: Input/out ...
- C 和 C++ 混合代码 cmath编译出错
最近在网上下载了 Triangle 库,准备在程序中调用来三角化生成网格,但出现了很多错误,如下: 1> triangle.c1>d:\program files\visualstudi ...
- C++ find 函数用法
头文件 #include <algorithm> 函数实现 template<class InputIterator, class T> InputIterator find ...
- win7 快捷键
F F1 显示辅助 F2 重命名选定项目 F3 搜索文件或文件夹 F4 在 Windows 资源管理器中显示地址栏列表 F5 刷新活动窗口 F6 在窗口中或桌面上循环切换屏幕元素 F10 激活活动程序 ...
- 如何在MFC中添加对话栏
- 对于Eclipse的正确用法
有时候我们刚刚修改了工程里的文件 但是启动的时候它硬是说你有东西没有声明 而那个东西又明明在那里.. 这时候我们可以认为实际与它调用的工程关系文件(我假想的) 不同步.. 我们可以通过clean功能来 ...