对一排数字输入命令来置换,看了网上的,觉得差不多了,自己不一定写出来
#include <iostream>
using namespace std;
int lef[100005],righ[100005];
void link(int l,int r)
{
lef[r]=l;
righ[l]=r;
}
int main()
{
int n,m,kase=0;
while(~scanf("%d %d",&n,&m))
{
for(int i=1;i<=n;i++)
{
lef[i]=i-1;
righ[i]=(i+1)%(n+1);
}
lef[0]=n;
righ[0]=1;
int op,x,y,cnt=0;
while(m--)
{
scanf("%d",&op);
if(op==4)
{
cnt=!cnt;
}
else
{
scanf("%d %d",&x,&y);
int lx=lef[x],rx=righ[x],ly=lef[y],ry=righ[y];
if(op==3)
{
if(lx==y)
{
link(ly,x);
link(x,y);
link(y,rx);
}
else if(rx==y)
{
link(lx,y);
link(y,x);
link(x,ry);
}
else
{
link(lx,y);
link(y,rx);
link(ly,x);
link(x,ry);
}
continue;
}
if((op==1||op==2)&&cnt)
{
op=3-op;
}
if(op==1)
{
if(lef[y]==x)
continue;
else
{
link(ly,x);
link(x,y);
link(lx,rx);
}
}
else if(op==2)
{
if(righ[y]==x)
continue;
else
{
link(lx,rx);
link(y,x);
link(x,ry);
}
}
}
}
long long a=0;
int b=0;
for(int i=1;i<=n;i++)
{
b=righ[b];
if(i%2)
a=a+b;
}
if(cnt&&n%2==0)
a=(long long)n*(n+1)/2-a;
printf("Case %d: %lld\n",++kase,a);
}
return 0;
}