1. 程式人生 > 其它 >2022.3.26(2)

2022.3.26(2)

//模擬連結串列。Uva 12657

#include<cstdio>
#include<algorithm>
using namespace std;
int right[100010],left[100010];
void link(int a,int b)//將a b變成左右連線的狀態
{
right[a]=b;
left[b]=a;
}
int main()
{
int n,m,kase=0;
while(scanf("%d%d",&n,&m)==2)
{
int op,x,y;
int flag=0;
for(int i=1;i<=n;i++)
{
right[i]=(i+1)%(n+1);//初始化連結串列
left[i]=i-1;
}
right[0]=1;
left[0]=n;
while(m--)
{
scanf("%d",&op);
if(op==4)
flag=!flag;
else
{
scanf("%d%d",&x,&y);
if(op!=3&&flag)
op=3-op;
if(op==1&&left[y]==x)
continue;
if(op==2&&right[y]==x)
continue;
int a=left[x],b=right[x],c=left[y],d=right[y];
if(op==1)
{
link(a,b);
link(c,x);
link(x,y);
}
else if(op==2)
{
link(a,b);
link(x,d);
link(y,x);
}
else if(op==3)
{
if(right[x]==y)
{
link(y,x);
link(x,d);
link(a,y);
}
else if(right[y]==x)
{
link(x,y);
link(y,b);
link(c,x);
}
else
{
link(a,y);
link(y,b);
link(c,x);
link(x,d);
}
}
}
}
int s=0;
long long sum=0;
for(int i=1;i<=n;i++)
{
s=right[s];
if(i%2)
{
sum+=s;
}
}
if(n%2==0&&flag)
sum=(long long)n*(n+1)/2-sum;
printf("Case %d: %lld",++kase,sum);
}
return 0;
}