一行盒子,数组表示链表

#include<stdio.h>
int Left[100005],Right[100005];
void link(int L,int R){
	Right[L]=R;Left[R]=L;
}
int main(){
	int n,m,cas=0;
	while(scanf("%d%d",&n,&m)==2){
		for(int i=1;i<=n;i++){
			Left[i]=i-1;
			Right[i]=(i+1)%(n+1);
		}
		Right[0]=1;Left[0]=n;
		int op,X,Y,inv=0;
		while(m--){
			scanf("%d",&op);
			if(op==4)inv=!inv;
			else{
				scanf("%d%d",&X,&Y);
				//if(op==3&&Right[Y]==X)swap(X,Y);
				if(op!=3&&inv)op=3-op;
				if(op==1&&X==Left[Y])continue;
				if(op==2&&X==Right[Y])continue;
				int LX=Left[X],RX=Right[X],LY=Left[Y],RY=Right[Y];
				if(op==1){
					link(LX,RX);link(LY,X);link(X,Y);
				}
				else if(op==2){
					link(LX,RX);link(Y,X);link(X,RY);
				}
				else if(op==3){
					if(Right[Y]==X){int t=X;X=Y;Y=t; }
					if(Right[X]==Y){link(LX,Y);link(Y,X);link(X,RY); }
					else {link(LX,Y);link(Y,RX);link(LY,X);link(X,RY);}
				}
			}
		}
		int b=0;long long ans=0;
		for(int i=1;i<=n;i++){
			b=Right[b];
			if(i%2==1)ans+=b;
		}
		if(inv&&n%2==0)ans=(long long)n*(n+1)/2-ans;
		printf("Case %d: %lld\n",++cas,ans);
	}
	return 0;
}





#include<stdio.h>
#define M 100010
long long left[M],right[M],m,n,num,sum;
void link(long long x,long long y)
{
    left[y]=x;
    right[x]=y;
}
void init()
{
    int i;
    num=sum=0;
    right[0]=1;
    for(i=1;i<=n;i++)
    {
        left[i]=i-1;
        right[i]=i+1;
    }
    left[n+1]=n;
}
int main()
{
    long long i,h,x,y,t1,t2,count=1;
    while(scanf("%lld%lld",&n,&m)!=EOF)
    {
        init();
        for(i=1;i<=m;i++)
        {
            scanf("%lld",&h);
            if(num%2!=0)
            {
                if(h==1)h=2;
                else if(h==2)h=1;
            }
            if(h==4){num++;continue;}
            scanf("%lld%lld",&x,&y);
            if(h==1)
            {
                link(left[x],right[x]);
                link(left[y],x);
                link(x,y);
            }
            else if(h==2)
            {
                link(left[x],right[x]);
                link(x,right[y]);
                link(y,x);
            }
            else if(h==3)
            {
                if(left[y]==x)
                {
                    link(left[x],y);
                    link(x,right[y]);
                    link(y,x);
                    continue;
                }
                if(left[x]==y)
                {
                    link(left[y],x);
                    link(y,right[x]);
                    link(x,y);
                    continue;
                }
                t1=left[y];
                t2=right[y];
                link(left[x],right[x]);
                link(left[x],y);
                link(y,right[x]);
                link(t1,t2);
                link(t1,x);
                link(x,t2);
            }
        }
        if(num%2==0) for(i=1,y=0;i<=n;i++){
            if(i%2)sum+=right[y];
            y=right[y];
        }
        else for(i=1,y=n+1;i<=n;i++){
            if(i%2)sum+=left[y];
            y=left[y];
        } printf("Case %lld: %lld\n",count++,sum);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值