一行盒子,数组表示链表

来源:互联网 发布:mac软件删除不彻底 编辑:程序博客网 时间:2024/05/16 06:33
#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 100010long 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
原创粉丝点击