[BZOJ3506]CQOI2014排序机械臂
来源:互联网 发布:编程循环 编辑:程序博客网 时间:2024/05/01 23:28
挺有意思的。。看到区间翻转好像很容易想到splay,想到之后就没什么难度了。。每个节点维护一个子树最小值,没次删去一个点,该打标记打标记就是。。为了处理同大小的数要以初始序号为第二关键字。。
#include<cstdio>#include<iostream>#define N 100005#define lc c[x][0]#define rc c[x][1]#define inf 2000000005using namespace std;struct Num{int n,xu;}num[N],minn[N];int n,i,nd=0,root=0,rk,t,q[N],c[N][2],size[N],pre[N],rev[N];bool operator==(Num a,Num b){return a.n==b.n&&a.xu==b.xu;}bool operator<(Num a,Num b){if (a.n!=b.n) return a.n<b.n;else return a.xu<b.xu;}void update(int x){size[x]=size[lc]+size[rc]+1;minn[x]=min(min(minn[lc],minn[rc]),num[x]);}void mark(int x){rev[x]^=1;swap(lc,rc);}void down(int x){if (rev[x]) mark(lc),mark(rc),rev[x]=0;}void build(int &x,int l,int r,int fa){if (l>r) return;int mid=(l+r)>>1;x=++nd;num[x].n=q[mid];num[x].xu=mid;pre[x]=fa;build(lc,l,mid-1,x);build(rc,mid+1,r,x);update(x);}void rot(int x,int kind){int y=pre[x],z=pre[y];down(y);pre[c[x][kind]]=y;c[y][!kind]=c[x][kind];pre[y]=x;c[x][kind]=y;pre[x]=z;if (z) c[z][c[z][1]==y]=x;update(y);update(x); }void splay(int x,int goal){int y,z,kind;while (pre[x]!=goal)if (pre[y=pre[x]]==goal) rot(x,c[y][0]==x);else{int z=pre[y],kind=(c[z][0]==y);down(z);if (c[y][kind]==x) rot(x,!kind);else rot(y,kind);rot(x,kind);}if (goal==0) root=x;}int merge(int s1,int s2){int x=s1;down(x);while (c[x][1]) x=c[x][1],down(x);splay(x,pre[s1]);c[x][1]=s2;pre[s2]=x;update(x);return x;}void del(int x){splay(x,0);down(x);if (lc*rc==0) root=lc+rc;else root=merge(lc,rc);pre[root]=0;}int get(int x){down(x);if (minn[x]==num[x]){rk+=size[lc];return x;}if (minn[lc]<minn[rc]) return get(lc);else{rk+=size[lc]+1;return get(rc);}}int main(){scanf("%d",&n);for (i=1;i<=n;i++) scanf("%d",&q[i]),rev[i]=0;size[0]=0;num[0].n=minn[0].n=inf;build(root,1,n,0);for (i=1;i<=n;i++){rk=0;t=get(root);splay(t,0);mark(c[t][0]);del(t);printf("%d ",rk+i);}}
0 0
- bzoj3506 [Cqoi2014]排序机械臂
- [BZOJ3506]CQOI2014排序机械臂
- 【bzoj3506】【CQOI2014】排序机械臂
- [BZOJ3506][BZOJ1552] [Cqoi2014]排序机械臂
- BZOJ3506 [Cqoi2014]排序机械臂(离散化+Splay)
- bzoj3506【CQOI2014】排序机械臂 bzoj1552【CERC2007】robotic sort
- 【平衡树维护序列】BZOJ3506(Cqoi2014)[排序机械臂]题解
- BZOJ3506 排序机械臂
- bzoj3506&1552 [Cerc2007][Cqoi2014]robotic sort 排序机械臂(splay)
- 【CQOI2014】排序机械臂
- 【CQOI2014】排序机械臂
- 【CQOI2014】排序机械臂
- JZOJ3599【CQOI2014】排序机械臂
- CQOI2014 排序机械臂--splay膜版题
- 【jzoj3599】【CQOI2014】【排序机械臂】【splay】
- 【BZOJ】【P1552&3506】【Cqoi2014】【排序机械臂】【题解】【Treap】
- 【splay】BZOJ 1152 && 3506:[cqoi2014]排序机械臂
- 【CQOI2014】【BZOJ 3506】【JZOJ 3599】排序机械臂
- PHP实现各种排序算法
- Grunt入门篇
- Win7配置CUDA并搭建基于Theano框架的GPU加速环境
- git push error
- javascript性能优化-repaint和reflow
- [BZOJ3506]CQOI2014排序机械臂
- 黑马程序员————增强for
- 迷宫老鼠游戏
- java 链表
- filter2D滤波处理函数-----学习记录(2)
- 基于用户反馈的QoS可信评价
- iOS —— UIApplication 获取手机状态栏中的网络状态
- 和小强一起学数据结构之冒泡排序
- 我的第一本C++笔记(1)——初识C++