Tyvj P1729 文艺平衡树 Splay
背景
描述
翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
输入格式
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
输出格式
测试样例1
输入
5 3
1 3
1 3
1 4
输出
4 3 2 1 5
备注
- #include<bits/stdc++.h>
- using namespace std;
- #define MAXN 100010
- struct node
- {
- int left,right,size,val;
- }tree[MAXN];
- int rev[MAXN],father[MAXN],a[MAXN];
- int read()
- {
- int s=,fh=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
- while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
- return s*fh;
- }
- void Pushup(int k)
- {
- tree[k].size=tree[tree[k].left].size+tree[tree[k].right].size+;
- }
- void Pushdown(int k)
- {
- int l=tree[k].left,r=tree[k].right;
- if(rev[k]!=)
- {
- rev[k]^=;rev[l]^=;rev[r]^=;
- swap(tree[k].left,tree[k].right);
- }
- }
- void Build(int l,int r,int f)
- {
- if(l>r)return;
- int now=l,last=f;
- if(l==r)
- {
- father[now]=last;tree[now].size=;tree[now].val=a[l];
- if(l<f)tree[last].left=now;
- else tree[last].right=now;
- return;
- }
- int mid=(l+r)/;
- now=mid;
- Build(l,mid-,mid);Build(mid+,r,mid);
- tree[now].val=a[mid];
- father[now]=last;Pushup(now);
- if(mid<f)tree[last].left=now;
- else tree[last].right=now;
- }
- void Rotate(int x,int &root)
- {
- int y=father[x],z=father[y];
- if(y==root)root=x;
- else
- {
- if(tree[z].left==y)tree[z].left=x;
- else tree[z].right=x;
- }
- if(tree[y].left==x)
- {
- father[x]=z;father[y]=x;tree[y].left=tree[x].right;tree[x].right=y;father[tree[y].left]=y;
- }
- else
- {
- father[x]=z;father[y]=x;tree[y].right=tree[x].left;tree[x].left=y;father[tree[y].right]=y;
- }
- Pushup(y);Pushup(x);
- }
- void Splay(int x,int &root)
- {
- int y,z;
- while(x!=root)
- {
- y=father[x];z=father[y];
- if(y!=root)
- {
- if((tree[y].left==x)^(tree[z].left==y))Rotate(x,root);
- else Rotate(y,root);
- }
- Rotate(x,root);
- }
- }
- int Find(int k,int rank)
- {
- Pushdown(k);
- int l=tree[k].left,r=tree[k].right;
- if(rank==tree[l].size+)return k;
- if(rank<=tree[l].size)return Find(l,rank);
- else return Find(r,rank-tree[l].size-);
- }
- int main()
- {
- int n,m,i,nn,s1,s2,x,y,z,rt;
- n=read();m=read();nn=n;
- for(i=;i<=n+;i++)a[i]=i-;
- rt=(+n+)/;Build(,n+,);
- for(i=;i<=m;i++)
- {
- s1=read();s2=read();
- x=Find(rt,s1);y=Find(rt,s2+);
- Splay(x,rt);Splay(y,tree[x].right);
- z=tree[y].left;rev[z]^=;
- }
- for(i=;i<=n;i++)
- {
- //printf("%d ",Find(rt,i)-1);
- x=Find(rt,i);y=Find(rt,i+);
- Splay(x,rt);Splay(y,tree[x].right);
- z=tree[y].left;
- printf("%d ",tree[z].val);
- }
- fclose(stdin);
- fclose(stdout);
- return ;
- }
Tyvj P1729 文艺平衡树 Splay的更多相关文章
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[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 ...
- 【BZOJ3223】 Tyvj 1729 文艺平衡树 Splay
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 ...
- bzoj 3223/tyvj 1729 文艺平衡树 splay tree
原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...
- bzoj3223: Tyvj 1729 文艺平衡树 splay裸题
splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...
- BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)
题目链接 splay: #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f ...
- BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系
题解: 每次reverse(l,r) 把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了 每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下 记得建树的时候建 ...
随机推荐
- 使用ajaxFileUpload实现异步上传图片
index.html <head runat="server"> <title></title> <script src="jq ...
- Oracle 插入数据
6个柜面交易 打印修改--050101 delete from tran_prints where tran_id = (select id from tran where code='050101' ...
- sublime c++ builder
rt, mark { "cmd": ["g++", "${file}", "-o", "${file_path ...
- 【JSF框架】 是一种标准
典型的JSF应用程序包含下列部分: 一组JSP页面 一组后台bean(为在一个页面上的UI组件定义的属性和函数的JavaBean组件) 应用程序配置资源文件(定义页面导航规则.配置bean和其它的自定 ...
- 在Linux上安装Memcached服务
下载并安装Memcache服务器端服务器端主要是安装memcache服务器端.下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz ...
- Linux下配置jdk1.7
第一步:下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586 ...
- SQL中Case的使用方法(上篇)(转)
http://www.cnblogs.com/fxgachiever/archive/2010/09/09/1822106.html Case具有两种格式.简单Case函数和Case搜索函数. --简 ...
- [状压dp]HDOJ3182 Hamburger Magi
题意 大致是: 有n个汉堡 m块钱 (n<=15) 然后分别给n个汉堡的能量 再分别给n个汉堡所需的花费 然后下面n行 第i行有x个汉堡要在i汉堡之前吃 然后给出这x个汉堡的编号 输出 能获得 ...
- easyui源码翻译1.32---ProgressBar(进度条)
前言 使用$.fn.progressbar.defaults重写默认值对象.下载该插件翻译源码 进度条提供了一个反馈显示一个长时间运行的操作进展.可以更新的进展条,让用户知道当前正在执行操作. 源码 ...
- C++中为什么要用虚函数、指针或引用才能实现多态?
原文链接:http://blog.csdn.net/zoopang/article/details/14071779 学过C++的都知道,要实现C++的多态性必须要用到虚函数,并且还要使用引用或者指针 ...