您的位置:首页 > 其它

BZOJ1552: [Cerc2007]robotic sort

2014-11-29 19:57 399 查看

1552: [Cerc2007]robotic sort

Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 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了感觉是调不出来了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: