模拟双向链表,自己的方法太繁琐了╥﹏╥...
这是我的代码(好渣)
#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
*/
#inclu