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相邻时的情况

posted @ 2018-07-13 14:55  昤昽  阅读(109)  评论(0编辑  收藏  举报