BZOJ 3223 Splay 解题报告
来源:互联网 发布:黑马程序员 百度云 编辑:程序博客网 时间:2024/05/17 08:17
3223: Tyvj 1729 文艺平衡树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 4590 Solved: 2679
[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
5 3
1 3
1 3
1 4
Sample Output
4 3 2 1 5
【解题报告】
裸题
代码如下:
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>using namespace std;int n,m,sz,rt;int fa[100005],c[100005][2],id[100005];int size[100005];bool rev[100005];void pushup(int k){ int l=c[k][0],r=c[k][1]; size[k]=size[l]+size[r]+1;}void pushdown(int k){ int l=c[k][0],r=c[k][1]; if(rev[k]) { swap(c[k][0],c[k][1]); rev[l]^=1;rev[r]^=1; rev[k]=0; }}void rotate(int x,int &k){ int y=fa[x],z=fa[y],l,r; if(c[y][0]==x) l=0; else l=1; r=l^1; if(y==k) k=x; else { if(c[z][0]==y)c[z][0]=x; else c[z][1]=x; } fa[x]=z; fa[y]=x; fa[c[x][r]]=y; c[y][l]=c[x][r]; c[x][r]=y; pushup(y); pushup(x);}void splay(int x,int &k){ while(x!=k) { int y=fa[x],z=fa[y]; if(y!=k) { if(c[y][0]==x^c[z][0]==y) rotate(x,k); else rotate(y,k); } rotate(x,k); }}int find(int k,int rank){ pushdown(k); int l=c[k][0],r=c[k][1]; if(size[l]+1==rank) return k; else if(size[l]>=rank) return find(l,rank); else return find(r,rank-size[l]-1);}void rever(int l,int r){ int x=find(rt,l),y=find(rt,r+2); splay(x,rt); splay(y,c[x][1]); int z=c[y][0]; rev[z]^=1;}void build(int l,int r,int f){ if(l>r) return; int now=id[l],last=id[f]; if(l==r) { fa[now]=last; size[now]=1; if(l<f) c[last][0]=now; else c[last][1]=now; return; } int mid=(l+r)>>1; now=id[mid]; build(l,mid-1,mid); build(mid+1,r,mid); fa[now]=last; pushup(mid); if(mid<f) c[last][0]=now; else c[last][1]=now;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n+2;i++) id[i]=++sz; build(1,n+2,0); rt=(n+3)>>1; for(int i=1;i<=m;i++) { int l,r; scanf("%d%d",&l,&r); rever(l,r); } for(int i=2;i<=n+1;i++) printf("%d ",find(rt,i)-1); return 0;}
让我看到你们的双手
阅读全文
0 0
- bzoj 3223 splay 解题报告
- BZOJ 3223 Splay 解题报告
- BZOJ 1269 [AHOI 2006] STL(rope)\SPLAY 解题报告
- bzoj 3223(splay)
- BZOJ 1588 TREAP 解题报告
- BZOJ 3224 TREAP 解题报告
- BZOJ 1820 DP 解题报告
- BZOJ 2144 LCA 解题报告
- BZOJ 4152 博弈论 解题报告
- BZOJ 1566 DP 解题报告
- BZOJ 3119 贪心 解题报告
- bzoj 1036 树链剖分 解题报告
- bzoj 3696 化合物 解题报告
- BZOJ 2563 贪心 解题报告
- BZOJ 3790 Manacher 解题报告
- BZOJ 2160 Manacher 解题报告
- BZOJ 2038 莫队 解题报告
- BZOJ 3687 bitset 解题报告
- MVVM模式通过ViewModel实现view和model的低耦合
- Java中的多线程你只要看这一篇就够了
- JAVA设计模式七之 原型模式
- 2017年初编码标题之一:通过关键字查找在文字中出现的次数并按照降序的排列进行展示
- Hadoop第一天
- BZOJ 3223 Splay 解题报告
- Spring面向切面编程AOP(around)
- Vue2.0 进阶组件篇 3 值得一看的(Toast 组件)
- echarts 双折线图
- Nginx做负载均衡
- 杂记
- 面试总结一
- hadoop调度器
- 离散题目1