首页 > 代码库 > bzoj 1552: [Cerc2007]robotic sort
bzoj 1552: [Cerc2007]robotic sort
1552: [Cerc2007]robotic sort
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1198 Solved: 457
[Submit][Status][Discuss]
Description
Input
输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000。
第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号。
Output
输出共一行,N个用空格隔开的正整数P1,P2,P3…Pn,Pi表示第i次操作前第i小的物品所在的位置。
注意:如果第i次操作前,第i小的物品己经在正确的位置Pi上,我们将区间[Pi,Pi]反转(单个物品)。
Sample Input
6
3 4 5 1 6 2
3 4 5 1 6 2
Sample Output
4 6 4 5 6 6
HINT
Source
HNOI2009集训Day6
splay区间反转
#include<cstdio>#include<algorithm>using namespace std;#define INF 0x7fffffffint n;const int maxn = 100020;struct Data{ int a,pos; bool operator < (const Data & q)const { if(q.a==a)return pos<q.pos; else return a<q.a; }}l[maxn];int mn[maxn],size[maxn],root,data[maxn],ch[maxn][2],mnpos[maxn];int rev[maxn],fa[maxn];inline void pushdown(int x){ rev[x]=0; rev[ch[x][0]]^=1; rev[ch[x][1]]^=1; swap(ch[ch[x][0]][0],ch[ch[x][0]][1]); swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);}inline void pushup(int x){ mn[x]=min(data[x],min(mn[ch[x][1]],mn[ch[x][0]])); if(mn[x]==data[x])mnpos[x]=x; else if(mn[x]==mn[ch[x][0]])mnpos[x]=mnpos[ch[x][0]]; else mnpos[x]=mnpos[ch[x][1]]; size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}inline int getkth(int k,int rt){ if(rev[rt])pushdown(rt); if(k==size[ch[rt][0]]+1)return rt; if(k<size[ch[rt][0]]+1)return getkth(k,ch[rt][0]); else getkth(k-size[ch[rt][0]]-1,ch[rt][1]);}inline int son(int x){ return ch[fa[x]][1]==x;}void rotate(int x){ int y=fa[x],z=fa[y],b=son(x),c=son(y),a=ch[x][!b]; if(z)ch[z][c]=x;else root=x;fa[x]=z; if(a)fa[a]=y;ch[y][b]=a; ch[x][!b]=y;fa[y]=x; pushup(y),pushup(x);}void splay(int &x,int i) { while(fa[x]!=i) { int y=fa[x],z=fa[y]; if(z==i){ rotate(x); }else { if(rev[z])pushdown(z);if(rev[y])pushdown(y);if(rev[x])pushdown(x); if(son(x)==son(y)) { rotate(y),rotate(x); } else { rotate(x);rotate(x); } } }}int getmnpos(int l,int r){ int ll=getkth(l-1,root); int rr=getkth(r+1,root); splay(ll,0); splay(rr,ll); return mnpos[ch[rr][0]];}inline void reverse(int l,int r){ int ll=getkth(l-1,root),rr=getkth(r+1,root),p; splay(ll,0);splay(rr,ll); p=ch[rr][0];rev[p]^=1; swap(ch[p][0],ch[p][1]);}int main() { scanf("%d",&n); for(int i=2;i<=n+1;i++) scanf("%d",&l[i].a),l[i].pos=i; sort(l+2,l+n+2); for(int i=2;i<=n+1;i++)data[l[i].pos]=i; for(int i=0;i<=n+2;i++)mn[i]=INF; data[0]=data[1]=data[n+2]=INF;root=1; for(int i=1;i<=n+2;i++) { fa[i]=i-1; ch[i][1]=i+1; } ch[n+2][1]=0; for(int i=n+2;i>=1;i--) { pushup(i); } for(int i=1;i<=n;i++) { int po=getmnpos(i+1,n+1); splay(po,0); printf("%d",size[ch[po][0]]); reverse(i+1,size[ch[po][0]]+1); if(i!=n)printf(" "); } return 0;}
bzoj 1552: [Cerc2007]robotic sort
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。