uva12657
此题用数组完成伪链表,用stl -list写,会超时
注意:
- 执行翻转操作时,若真的将其全部翻转会超时。应记录下翻转次数,若翻转次数为奇次,则操作1与操作2互换。
- 翻转为偶次时,操作为1时,若x在y左侧,则continue;操作为2时,若x在y右侧,则continue;
- 翻转为奇次时,操作为1时,若x在y右侧,则continue;操作为2时,若x在y左侧,则continue;
- 操作为3时,x,y相连的操作与x,y不相连的操作不同。
- 在计算奇位数的和时: 若n的值为偶数,且翻转操作次数为偶数则只需要求奇数位的和即可;翻转次数为奇数,则需要求偶数位的和(用总和减奇数位的和);若n的值为奇数,则不管如何翻转,奇数位的和不变。
#include<bits/stdc++.h>
using namespace std;
int r[200000],l[200000];
void link(int x,int y)
{
l[y]=x;
r[x]=y;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int n,m;
int num=0;
while(~scanf("%d%d",&n,&m))
{
num++;
r[0]=1;
l[0]=n;
for(int i=1;i<=n;i++)
{
r[i]=(i+1)%(n+1);
l[i]=i-1;
}
int t_4=0;
while(m--)
{
int x,y;
int op;
scanf("%d",&op);
if(op==4)
{
t_4++;
}
else
{
scanf("%d%d",&x,&y);
if(op==3&&r[y]==x)
swap(x,y);
if(t_4%2==1&&op!=3)
op=3-op;
int r_x=r[x],l_x=l[x],r_y=r[y],l_y=l[y];
if(op==1)
{
if(x==l_y)
{
continue;
}
else
{
link(l_x,r_x);
link(l_y,x);
link(x,y);
}
}
if(op==2)
{
if(x==r_y)
{
continue;
}
else
{
link(l_x,r_x);
link(y,x);
link(x,r_y);
}
}
if(op==3)
{
if(r_x==y)
{
link(l_x,y);
link(y,x);
link(x,r_y);
}
else
{
link(l_x,y);
link(y,r_x);
link(l_y,x);
link(x,r_y);
}
}
}
}
long long sum=0;
long long b=0;
for(int i=1;i<=n;i++)
{
b=r[b];
if(i%2)
{
sum+=b;
}
}
if(t_4%2&&n%2==0) sum=(long long)n*(n+1)/2-sum;
printf("Case %d: %lld\n",num,sum);
}
return 0;
}