Boxes In A Line[UVa12657]
UVa12657
#include <cstdio>
#include <cstring>
const int MAXN=1e5+5;
int next[MAXN],pre[MAXN],inv=0;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f*x;
}
inline void swap(int& a,int& b)
{
int t=a;a=b;b=t;
}
void del(int u)
{
next[pre[u]]=next[u];
pre[next[u]]=pre[u];
}
void insert(int u,int v)
{
//将 u 插入到 v 的右边
next[u]=next[v];
pre[next[v]]=u;
next[v]=u;
pre[u]=v;
}
void left(int x,int y)
{
if(next[x]==y)return;
del(x);
insert(x,pre[y]);
}
void right(int x,int y)
{
if(pre[x]==y)return;
del(x);
insert(x,y);
}
void exchange(int x,int y)
{
if(next[x]==y || next[y]==x)
{
if(next[y]==x){int t=x;x=y;y=t;}
next[x]=next[y];pre[y]=pre[x];
pre[next[y]]=x;next[pre[x]]=y;
pre[x]=y;next[y]=x;
}
else{
next[pre[x]]=y;next[pre[y]]=x;//x=3,y=4时 next[ pre[4] ]=3 => next[3]=3,自环.
pre[next[x]]=y;pre[next[y]]=x;
swap(next[x],next[y]);swap(pre[x],pre[y]);
}
}
int main()
{
int n,m,cnt=0;
while(scanf("%d %d",&n,&m)==2)
{
cnt++;
for(int i=0;i<=n;i++)next[i]=i+1;next[n+1]=-1;
for(int i=n+1;i>=0;i--)pre[i]=i-1;
inv=0;
for(int i=1;i<=m;i++)
{
int z=read();
if(z==4)inv=!inv;
else{
int x=read(),y=read();
if(z==1)
{
if(!inv)left(x,y);
else right(x,y);
}
else if(z==2){
if(!inv)right(x,y);
else left(x,y);
}
else if(z==3)exchange(x,y);
}
}
long long sum=0,all=0;
if(inv)
{
for(int it=pre[n+1],i=1;it;it=pre[it],i=!i)if(i)sum+=it;
}
else
for(int it=next[0],i=1;it<=n;it=next[it],i=!i)if(i)sum+=it;
printf("Case %d: %lld\n",cnt,sum);
}
return 0;
}
要注意 exchange 操作,当x,y相邻时的情况