BZOJ1552: [Cerc2007]robotic sort
2014-11-29 19:57
399 查看
1552: [Cerc2007]robotic sort
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 328 Solved: 134
[Submit][Status]
Description
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<map> #include<set> #include<queue> #include<string> #define inf 1000000000 #define maxn 200000+5 #define maxm 500+100 #define eps 1e-10 #define ll long long #define pa pair<int,int> #define for0(i,n) for(int i=0;i<=(n);i++) #define for1(i,n) for(int i=1;i<=(n);i++) #define for2(i,x,y) for(int i=(x);i<=(y);i++) #define for3(i,x,y) for(int i=(x);i>=(y);i--) #define mod 1000000007 using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} return x*f; } int n,rt,t1,t2,a[maxn],b[maxn],fa[maxn],c[maxn][2],mi[maxn][2],s[maxn]; bool rev[maxn]; inline void pushup(int x) { int l=c[x][0],r=c[x][1]; s[x]=s[l]+s[r]+1; mi[x][0]=a[x];mi[x][1]=s[l]+1; if(mi[x][0]>mi[l][0])mi[x][0]=mi[l][0],mi[x][1]=mi[l][1]; if(mi[x][0]>mi[r][0])mi[x][0]=mi[r][0],mi[x][1]=s[l]+1+mi[r][1]; } inline void rotate(int x,int &k) { //cout<<x<<' '<<k<<" AAAAAA"<<endl; int y=fa[x],z=fa[y],l=c[y][1]==x,r=l^1; if(y!=k)c[z][c[z][1]==y]=x;else k=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); } inline void splay(int x,int &k) { while(x!=k) { int 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); } rotate(x,k); } } inline void rever(int x) { if(!x)return; rev[x]^=1; swap(c[x][0],c[x][1]); mi[x][1]=s[x]+1-mi[x][1]; } inline void pushdown(int x) { if(!x)return; if(!rev[x])return; rever(c[x][0]);rever(c[x][1]); rev[x]=0; } inline int find(int x,int k) { pushdown(x); int l=c[x][0],r=c[x][1]; if(s[l]+1==k)return x; else if(s[l]>=k)return find(l,k); else return find(r,k-s[l]-1); } inline void split(int l,int r) { t1=find(rt,l);t2=find(rt,r); splay(t1,rt);splay(t2,c[t1][1]); } inline void build(int l,int r,int f) { if(l>r)return; int x=(l+r)>>1; fa[x]=f;c[f][x>f]=x; if(l==r){s[x]=1;mi[x][0]=a[x];mi[x][1]=1;return;} build(l,x-1,x);build(x+1,r,x); pushup(x); } inline bool cmp(int x,int y){return a[x]==a[y]?x<y:a[x]<a[y];} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read(); for2(i,2,n+1)a[i]=read(),b[i]=i; sort(b+2,b+n+2,cmp); for2(i,2,n+2)a[b[i]]=i; a[1]=a[n+2]=n+n;mi[0][0]=inf; build(1,n+2,0);rt=(1+n+2)>>1; for1(i,n) { //cout<<mi[rt][1]<<endl; int x=find(rt,mi[rt][1]); printf("%d",(n-(s[rt]-mi[rt][1]-1))); if(i!=n)printf(" "); //cout<<x<<endl; split(1,mi[rt][1]+1); rever(c[t2][0]); pushup(t2);pushup(t1); split(1,3); //cout<<"AAAAAAA"<<' '<<a[c[t2][0]]<<endl; c[t2][0]=0; pushup(t2);pushup(t1); } printf("\n"); return 0; }
View Code
刚开始没离散化WA了感觉是调不出来了。。。
相关文章推荐
- BZOJ 1552/1506 [Cerc2007]robotic sort
- bzoj1552 [Cerc2007]robotic sort
- bzoj【1552/3506】[Cerc2007]robotic sort
- 【BZOJ】1552/3506 [Cerc2007]robotic sort
- BZOJ1552 [Cerc2007]robotic sort
- BZOJ 1552 [Cerc2007]robotic sort
- BZOJ 1552 [Cerc2007]robotic sort
- BZOJ 1552: [Cerc2007]robotic sort
- BZOJ1552 [Cerc2007]robotic sort
- BZOJ1552: [Cerc2007]robotic sort
- bzoj3506【CQOI2014】排序机械臂 bzoj1552【CERC2007】robotic sort
- 【BZOJ 1552】[Cerc2007]robotic sort
- 【bzoj1552/3506】[Cerc2007]robotic sort
- BZOJ1552/3506 [Cerc2007]robotic sort
- bzoj 1552: [Cerc2007]robotic sort
- bzoj1552 [Cerc2007]robotic sort(splay)
- BZOJ 1552: [Cerc2007]robotic sort( splay )
- [BZOJ1552][Cerc2007]robotic sort(splay)
- BZOJ 1552: [Cerc2007]robotic sort/3506: [Cqoi2014]排序机械臂 splay
- 【bzoj1552】[Cerc2007]robotic sort splay