模拟双向链表,自己的方法太繁琐了╥﹏╥...
这是我的代码(好渣)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <ctime>
#include <iomanip>
using namespace std;
int l[100005],r[100005];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int www=1;
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
for(i=0;i<=n+2;i++)
{
l[i]=i-1;
r[i]=i+1;
}
int fanzhuan=0;
for(i=1;i<=m;i++)
{
int flag;
scanf("%d",&flag);
if(flag==4){
fanzhuan+=1;
continue;
}
else
{
if(flag==1&&fanzhuan%2==0||flag==2&&fanzhuan%2==1)
{
int a,b;
scanf("%d%d",&a,&b);
int la=l[a];
int lb=l[b];
int ra=r[a];
int rb=r[b];
if(a==b)continue;
if(l[b]==a)continue;
if(r[b]==a)
{
r[lb]=a;
l[a]=lb;
r[a]=b;
l[b]=a;
r[b]=ra;
l[ra]=b;
continue;
}
r[lb]=a;
l[b]=a;
r[la]=ra;
l[ra]=la;
l[a]=lb;
r[a]=b;
}
else if(flag==2&&fanzhuan%2==0||flag==1&&fanzhuan%2==1)
{
int a,b;
scanf("%d%d",&a,&b);
int la=l[a];
int lb=l[b];
int ra=r[a];
int rb=r[b];
if(a==b)continue;
if(r[b]==a)continue;
if(l[a]==b)
{
r[la]=b;
l[rb]=a;
r[a]=rb;
l[a]=b;
l[b]=la;
r[b]=a;
continue;
}
r[b]=a;
l[rb]=a;
l[a]=b;
r[a]=rb;
r[la]=ra;
l[ra]=la;
}
else if(flag==3)
{
int a,b;
scanf("%d%d",&a,&b);
int la=l[a];
int lb=l[b];
int ra=r[a];
int rb=r[b];
if(r[a]!=b&&l[a]!=b&&a!=b)
{
l[r[a]]=b;
r[l[b]]=a;
l[r[b]]=a;
r[l[a]]=b;
l[a]=lb;
r[a]=rb;
l[b]=la;
r[b]=ra;
}
else if(r[a]==b)
{
l[a]=b;
r[a]=rb;
r[b]=a;
l[b]=la;
r[la]=b;
l[rb]=a;
}
else if(r[b]==a)
{
l[b]=a;
r[b]=ra;
r[a]=b;
l[a]=lb;
r[lb]=a;
l[ra]=b;
}
}
}
// if(fanzhuan%2==0)
// {
// long long shu=1;
// for(long long i=0;;)
// {
// i=r[i];
// if(i==n+1||shu==n+1)break;
// printf("%d ",i);
// shu+=1;
// }
// }
// else {
// long long shu=1;
// for(long long i=n+1;;)
// {
// i=l[i];
// if(i==0||shu==n+1)break;
// printf("%d ",i);
// shu+=1;
// }
// }
// printf("\n");
}
long long sum=0;
if(fanzhuan%2==0)
{
long long shu=1;
for(long long i=0;;)
{
i=r[i];
if(i==n+1||shu==n+1)break;
// printf("%d ",i);
if(shu%2==1)sum+=i;
shu+=1;
}
}
else {
long long shu=1;
for(long long i=n+1;;)
{
i=l[i];
if(i==0||shu==n+1)break;
// printf("%d ",i);
if(shu%2==1)sum+=i;
shu+=1;
}
}
printf("Case %d: %lld\n",www,sum);
www+=1;
}
}
/*
21 6
3 19 19
2 2 4
2 20 14
1 8 9
3 20 16
3 16 2
*/
下面是网上的大神代码(摘自:http://www.bubuko.com/infodetail-1128030.html)
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
int l[100005],r[100005];
void link(int a,int b)
{
r[a]=b,l[b]=a;
}
int main()
{
int n,m,op,x,y,flag,cas=0;
while(scanf("%d%d",&n,&m)==2)
{
for(int i=1;i<=n;++i)
r[i]=(i+1)%(n+1),l[i]=i-1;
r[0]=1,l[0]=n;
flag=0;
while(m--)
{
scanf("%d",&op);
if(op==4)
flag=!flag;
else{
scanf("%d%d",&x,&y);
if(op==3&&r[y]==x)///方便下面的操作;
swap(x,y);
if(op!=3&&flag)
op=3-op;
if(op==1&&l[y]==x)
continue;
if(op==2&&r[y]==x)
continue;
int lx=l[x],rx=r[x],ly=l[y],ry=r[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(r[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 k=0;
long long ans=0;
for(int i=1;i<=n;++i){
k=r[k];
if(i&1)
ans+=k;
}
if(flag&&n%2==0)
ans=(long long)n/2*(n+1)-ans;
printf("Case %d: %lld\n",++cas,ans);
}
return 0;
}