【splay】文艺平衡树 BZOJ 3223
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
思路
一看就知道是Splay。。。。如此经典。也是我写过的第二道splay。第一道是文本编辑器,但是本地测AC,提交的话就WA到死。。
只有区间翻转操作,如果我们要翻转[L,R]的话,就将L-1转到根,再将第R+1大的转到根的右子树。把根的右子树的左子树打上翻转标记就行了。
[1,L-1]和[R+1,n]都被转到别的地方去了,所以不会被旋转。
然后别的都是splay的基本操作啦~只要每次记得push_down就行啦~
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#define pritnf printf
#define scafn scanf
#define sacnf scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
#define Clear(a) memset(a,0,sizeof(a))
using namespace std;
typedef unsigned int Uint;
const int INF=0x3fffffff;
///==============struct declaration==============
struct Node{
int Val;bool Rev;
int siz;
Node *lc,*rc;
Node(){lc=rc=NULL;Rev=false;siz=;}
};
///==============var declaration=================
const int MAXN=;
int n,q;
int num[MAXN];
Node *root=NULL;
///==============function declaration============
void BuildTree(int l,int r,Node *&o);
int find_kth(int rank,Node *&o);
void Splay(int Rank,Node *&o);
void Rrotate(Node *&x);void Lrotate(Node *&x);
void push_down(Node *&x);void Output(Node *&x);
void update(Node *&x);void TestOutput(Node *&x);
///==============main code=======================
int main()
{
#define FILE__
#ifdef FILE__
freopen("input","r",stdin);
freopen("output","w",stdout);
#endif
scanf("%d%d",&n,&q);
BuildTree(,n+,root);//TestOutput(root);printf("\n");
while (q--){
int L,R;scanf("%d%d",&L,&R);
if (L==R) continue;
Splay(L,root);
if (root->lc==NULL)
Splay(R+,root->rc);
else
Splay(R+-root->lc->siz,root->rc);
if (root->rc!=NULL&&root->rc->lc!=NULL)
root->rc->lc->Rev^=;
//TestOutput(root);printf("\n");
}
Output(root);
return ;
}
///================fuction code====================
void BuildTree(int l,int r,Node *&o){
int m=(l+r)>>;
o=new(Node);o->Val=m;
if (l==r) return;
if (m>l) BuildTree(l,m-,o->lc);
if (m<r) BuildTree(m+,r,o->rc);
if (o->lc!=NULL) o->siz+=o->lc->siz;
if (o->rc!=NULL) o->siz+=o->rc->siz;
}
void Lrotate(Node *&x){
push_down(x);push_down(x->lc);
Node *y=x->lc;
x->lc=y->rc;
y->rc=x;x=y;
update(x->rc);update(x);
}
void Rrotate(Node *&x){
push_down(x);push_down(x->rc);
Node *y=x->rc;
x->rc=y->lc;
y->lc=x;x=y;
update(x->lc);update(x);
}
void push_down(Node *&x){
if (x->Rev){
swap(x->lc,x->rc);
x->Rev=false;
if (x->lc!=NULL) x->lc->Rev^=;
if (x->rc!=NULL) x->rc->Rev^=;
}
}
void update(Node *&x){
x->siz=;
if (x->lc!=NULL) x->siz+=x->lc->siz;
if (x->rc!=NULL) x->siz+=x->rc->siz;
}
void Splay(int Rank,Node *&o){
int ls=;push_down(o);
if (o->lc!=NULL) ls=o->lc->siz;
if (Rank==ls+) return;
if (Rank>ls+){
Splay(Rank-ls-,o->rc);
Rrotate(o);
}
else{
Splay(Rank,o->lc);
Lrotate(o);
}
}
void Output(Node *&x){
if (x==NULL) return;
push_down(x);
Output(x->lc);
if (x->Val!=&&x->Val!=n+)
printf("%d ",x->Val);
Output(x->rc);
}
void TestOutput(Node *&x){
if (x==NULL) return;
if (!x->Rev){
printf("%d(",x->Val);
TestOutput(x->lc);
printf(",");
TestOutput(x->rc);
printf(")");
}
else{
printf("%d(",x->Val);
TestOutput(x->rc);
printf(",");
TestOutput(x->lc);
printf(")");
}
}
BZOJ 3223
那个TestOutput是我用来在不改变标记的情况下看数的结构的。
【splay】文艺平衡树 BZOJ 3223的更多相关文章
- 3223: Tyvj 1729 文艺平衡树 - BZOJ
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
- splay 文艺平衡树 (数据结构)
题目大意:略 splay维护区间翻转裸题,为了减少不必要的麻烦,多插入两个点,分别是0和n+1 每次找区间的第K个值,就在splay上二分即可 顺便学了一下splay的完美建树,而且splay有一些小 ...
- bzoj 3223 文艺平衡树 - Splay
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3884 Solved: 2235[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 ...
- fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)
题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...
- [题解]bzoj 3223 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3884 Solved: 2235[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
随机推荐
- 【WPF】 通过FarPoint显示Excel
1.FarPoint 只支持winform,在Wpf中要引用:WindowsFormsIntegration.dll2.*.xaml文件引用 xmlns:wfi ="clr-names ...
- chpasswd-批量修改用户密码
批量修改用户密码 工作原理: 从系统的标准输入读入用户的名称和口令,并利用这些信息来更新系统上已存在的用户的口令 语法: :# echo 用户名:密码 | chpasswd :# chpasswd & ...
- Java中List循环遍历的时候删除当前对象(自己)
方法一 Java代码 ArrayList<String> list = new ArrayList<String>(); list.add(" ...
- hdu3714 三分找最值
Error Curves Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- [转]如何循序渐进向dotnet架构师发展
微软的DotNet开发绝对是属于那种入门容易提高难的技术.而要能够成为DotNet架构师没有三年或更长时间的编码积累基本上是不可能的.特别是在大 型软件项目中,架构师是项目核心成员,承上启下,因此RU ...
- 如何在sublime text上快速访问html页面?
第一步.安装package control和安装sidebarenhancements插件 原来Subl3安装Package Control很麻烦,现在简单的方法来了 使用Ctrl+`快捷键或者通过V ...
- 我用ANDROID STUDIO开发,页面上总包这个警告,很烦!网上说是sdk版本问题,但是我是基于25开发的,最小版本也是19,有没有老司机啊?3克油
- 每次更新obj和bin文件夹都生成nGB的文件
今天受不了,把它们符号链接到机械硬盘上了 用mklink /d 创建的,也不知道和/j有什么区别
- Data Binding使用技巧
Data Binding 根据变量,自动赋值到各widget. How 1.编写layout文件,这里的layout为: act_data_bind_demo.xml 这里需要先准备变量 在具体的wi ...
- VS2015插件
这里记录一下,VS2015使用的插件和具体用法链接 Refactoring Essentils:代码重构分析 http://vsrefactoringessentials.com/ 可以使用 取消 R ...