分析:看到这题,就想用list,自己写了好久,其中erase和insert需要注意好多东西,好不容易搞定了,提交总是超时。大概list的遍历会很慢吧。书上用的是数组形式双向链表,学习了一下,AC了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cstdlib>
using namespace std;
const int maxn=100005;
int Right[100005],Left[100005];
void link(int L, int R)
{
Right[L]=R;
Left[R]=L;
}
int main()
{
int n,m;
int op;
int cas=0;
while(~scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
{
Left[i]=i-1;
Right[i]=(i+1)%(n+1);
}
Right[0]=1;
Left[0]=n;
int inv=0;
int X,Y;
while(m--)
{
cin>>op;
if(op==4)
inv=!inv;
else
{
cin>>X>>Y;
if(op==3&&Right[Y]==X) swap(X,Y);
if(op!=3&&inv) op=3-op;
if(op==1&&Right[X]==Y) continue;
if(op==2&&Right[Y]==X) continue;
int LX=Left[X], RX=Right[X], LY=Left[Y], RY=Right[Y];
if(op==1)
{
link(LX,RX);
link(X,Y);
link(LY,X);
}
else if(op==2)
{
link(LX,RX);
link(Y,X);
link(X,RY);
}
else if(op==3)
{
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);
}
}
}
}
int t=0;
long long ans=0;
for(int i=1; i<=n; i++)
{
t=Right[t];
if(i%2)
ans+=t;
}
if(inv&&n%2==0) ans=(long long)n*(n+1)/2-ans;
cout<<"Case "<<++cas<<": "<<ans<<endl;
}
return 0;
}
TLE
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<list>
#include<deque>
#define LL long long
using namespace std;
const int maxn=100005;
//typedef list<int>LIST;
int main()
{
freopen("f.txt","r",stdin);
list<int> lis;
list<int>::iterator it,vx,vy,bed,ed,vvx,vvy;
int n,m,x,y,kk;
int cas=0;
while(scanf("%d%d",&n,&m)!=EOF){
if(!lis.empty())
lis.clear();
lis.push_back(0);
for(int i=1;i<=n;i++){
lis.push_back(i);
}
lis.push_back(0);
bool flag=false;
for(int i=0;i<m;i++){
scanf("%d",&kk);
if(kk==4){
flag=!flag;
continue;
}
scanf("%d%d",&x,&y);
// if(kk==1){
int posx=0,posy=0,p=0;
for(it=lis.begin();it!=lis.end();it++){
p++;
if(*it==x){
vx=it;
posx=p;
}
else if(*it==y){
vy=it;
posy=p;
}
// if(posx&&posy)break;
}
if(kk==3){
// if(vx++!=lis.end()--&&vy++!=lis.end()--){
vvx=vx;
vvy=vy;
lis.insert(vvx++,y);
lis.erase(vx);
lis.insert(vvy++,x);
lis.erase(vy);
continue;
// }
}
if(flag)kk=3-kk;
if(kk==1){
// vvx=vx;
// vvy=vy;
if(posx==posy-1)continue;
if(posx<posy){
lis.insert(vy,x);
lis.erase(vx);
}
else{
lis.erase(vx);
lis.insert(vy,x);
}
}
else if(kk==2){
if(posx==posy+1)continue;
vy++;
if(posx<posy){
lis.insert(vy,x);
lis.erase(vx);
}
else{
lis.erase(vx);
lis.insert(vy,x);
}
}
}
LL ans=0;
int j=0;
bed=lis.begin();
bed++;
ed=lis.end();
ed--;
for(it=bed;it!=ed;it++){
if((++j)%2==1)ans+=*it;
}
if(flag&&j%2==0)ans=(LL)n*(n+1)/2-ans;
printf("Case %d: %lld\n",++cas,ans);
}
return 0;
}