CODEVS 1743(伸展树区间翻转)
来源:互联网 发布:linux 启动文件丢失 编辑:程序博客网 时间:2024/06/04 19:58
题目链接:http://codevs.cn/problem/1743/
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 300010int c[N][2],fa[N],rev[N],v[N],sz[N];int n,rt;void pushup(int x){ int l=c[x][0],r=c[x][1]; sz[x]=sz[l]+sz[r]+1;}void build(int l,int r,int f){ if(l>r) return; int now=l,last=f; if(l==r) { sz[now]=1;fa[now]=last; if(l<f) c[last][0]=now; else c[last][1]=now; return; } int mid=l+r>>1;now=mid; build(l,mid-1,mid);build(mid+1,r,mid); fa[now]=last;pushup(now); if(l<f) c[last][0]=now; else c[last][1]=now;}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){ int y,z; while(x!=k) { //printf("%d %d ??\n",x,k); y=fa[x];z=fa[y]; if(y!=k) { if(c[z][0]==y^c[y][0]==x) rotate(x,k); else rotate(y,k); } else rotate(x,k); }}void pushdown(int k){ int l=c[k][0],r=c[k][1]; if(rev[k]) { rev[l]^=1;rev[r]^=1; swap(c[k][0],c[k][1]); rev[k]=0; }}int find(int k,int rank){ pushdown(k); int l=c[k][0],r=c[k][1]; if(rank<=sz[l]) return find(l,rank); else if(rank==sz[l]+1) return k; else return find(r,rank-sz[l]-1);}void reverse(int s,int t){ int x=find(rt,s-1),y=find(rt,t+1),z; splay(x,rt);splay(y,c[x][1]); z=c[y][0];rev[z]^=1;}int main(){ scanf("%d",&n); for(int i=2;i<=n+1;++i) scanf("%d",&v[i]); build(1,n+2,0);rt=n+3>>1; int ans=0,x,y,z; while(true) { x=find(rt,2); if(v[x]==1) break; reverse(2,v[x]+1); ++ans; } printf("%d\n",ans); return 0;}
阅读全文
0 0
- CODEVS 1743(伸展树区间翻转)
- hdu 1890 伸展树区间翻转
- hdu1890 伸展树区间翻转复习
- 3303 翻转区间 伸展树的解法
- CODEVS 1286(伸展树)
- CODEVS 1343(伸展树)
- codevs 1743 反转卡片【Splay区间翻转】
- CODEVS 3243 区间翻转 (SBT)
- CODEVS-3303-翻转区间
- 【CodeVS】3303 翻转区间
- hdu 1890 区间翻转——伸展树
- hdu 1890伸展树(splay tree)区间翻转
- hdu3487 (splay伸展树 区间翻转,切割,插入)
- BZOJ 3223 浅谈SPLAY伸展树算法区间翻转
- 序列神器伸展树 区间维护,区间提取,区间翻转的AC模板。
- 【codevs 3303】翻转区间 splay
- 伸展树(插入、删除区间)BZOJ1269
- codevs 1743 翻转卡片(splay)
- hdoj2005_第几天?
- c++的默认拷贝构造函数,从深度拷贝和浅拷贝说起
- 【学习笔记】天嵌2440第三季下学期——linux消息队列编程
- Java ServerSocket Socket
- hdu3265-Posters 线段树+离散化 求矩形面积并
- CODEVS 1743(伸展树区间翻转)
- C/C++笔试题
- 面试简记(2017/7/24)
- git查看某个文件的修改历史
- POJ
- 用List构建带有层次结构的json数据
- Html5第十课时,年龄成绩判断
- 如此让人放弃的面向对象三大特征——看完就搞定
- 51nod--1088 最长回文子串(连续!)