此题也就是将数据结构课中的双向链表用数组表示,并将其进行运用,做题的过程中遇到的一点小问题就是通过时间复杂度可知,指令4是不能够遍历一次数组的,然后我们发现指令1,2具有相似程度,在翻转一次后,执行指令一,相当于是在没翻转的时候执行指令2。于是可以用一个变量来储存翻转的次数,从而进行解答。
在完成指令题的时候,通过UVA12657和UVA101可总结出,我们在完成不同指令之前,要学会去寻找不同指令的相似之处,并将其归纳整理,从而达到简化代码的效果。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100005;
int l[maxn],r[maxn],cpy[maxn];
bool flag;
int n,m;
void Init(){
l[0]=-1;
for(int i=1;i<=n;i++){
l[i]=i-1;
}
r[n]=0;
for(int i=0;i<n;i++){
r[i]=i+1;
}
}
void fun1(int a,int b){
r[l[a]]=r[a];
l[r[a]]=l[a];
l[a]=l[b];
r[l[b]]=a;
r[a]=b;
l[b]=a;
}
void fun2(int a,int b){
r[l[a]]=r[a];
l[r[a]]=l[a];
r[a]=r[b];
l[r[b]]=a;
l[a]=b;
r[b]=a;
}
void fun3(int a,int b){
if(l[a]!=b&&l[b]!=a){
int x1=l[a],y1=r[a];
int x2=l[b],y2=r[b];
r[x1]=b;
if(y1!=0){
l[y1]=b;
}
r[x2]=a;
if(y2!=0){
l[y2]=a;
}
l[a]=x2;
r[a]=y2;
l[b]=x1;
r[b]=y1;
}else {
if(l[a]==b){
swap(a,b);
}
r[l[a]]=b;
l[r[b]]=a;
l[b]=l[a];
r[a]=r[b];
r[b]=a;
l[a]=b;
}
}
int main(){
int cot=1;
while(cin>>n>>m) {
Init();
flag=true;
while(m--){
int t,a,b;
cin>>t;
if(t==1){
cin>>a>>b;
if(l[b]!=a){
if(flag)
fun1(a,b);
else fun2(a,b);
}
}else if(t==2){
cin>>a>>b;
if(r[b]!=a){
if(flag)
fun2(a,b);
else fun1(a,b);
}
}else if(t==3){
cin>>a>>b;
fun3(a,b);
} else {
flag=!flag;
}
}
int cnt=1;
ll ans=0;
if(!flag){
for(int i=1;i<=n;i++){
if(r[i]==0){
r[0]=i;
}
swap(r[i],l[i]);
}
}
// for(int i=0;i<=n;i++){
// cout<<i<<" l="<<l[i]<<" r="<<r[i]<<endl;
// }
for(int i=r[0];i!=0;i=r[i]){
if(cnt%2){
ans+=i;
}
cnt++;
//cout<<i<<endl;
}
cout<<"Case "<<cot++<<": "<<ans<<endl;
}
}