这道题还是用上道题的方法,有方向数组储存方向,有值数组储存值。这道题要用双向链表,所以用left和right来写。但是目前还没有写完,翻转链表和交换还有bug。bug的问题出在两个头结点在操作后可能会丢失链接。以后再来debug叭
#include<cstdio>
#include<cstring>
using namespace std;
int num[100005]={0},left[100005]={0},right[100005]={0};
void move_left(int a,int b)
{
int cur=right[0];
for(int i=1;i<a;i++)
{
cur=right[cur];
}
a=cur;
cur=right[0];
for(int i=1;i<b;i++)
{
cur=right[cur];
}
b=cur;
right[left[a]]=right[a];
left[right[a]]=left[a];
right[a]=b;
left[a]=left[b];
right[left[b]]=a;
left[b]=a;
}
void move_right(int a,int b)
{
int cur=right[0];
for(int i=1;i<a;i++)
{
cur=right[cur];
}
a=cur;
cur=right[0];
for(int i=1;i<b;i++)
{
cur=right[cur];
}
b=cur;
right[left[a]]=right[a];
left[right[a]]=left[a];
left[a]=b;
right[a]=right[b];
left[right[b]]=a;
right[b]=a;
}
void swaP(int a,int b)
{
int cur=right[0];
for(int i=1;i<a;i++)
{
cur=right[cur];
}
a=cur;
cur=right[0];
for(int i=1;i<b;i++)
{
cur=right[cur];
}
b=cur;
left[right[a]]=b;
right[left[a]]=b;
right[left[b]]=a;
left[right[b]]=a;
int temp ;
temp=left[a];
left[a]=left[b];
left[b]=temp;
temp=right[a];
right[a]=right[b];
right[b]=temp;
}
void rev (int n)
{
int cur;
for(int i=right[0];i!=n+1;i=cur)
{
cur=right[i];
right[i]=left[i];
left[i]=cur;
}
}
int main(void)
{
int n,m,cs=1;
while(scanf("%d %d",&n,&m)==2)
{
right[0]=1;
for(int i=1;i<=n;i++)
{
num[i]=i;
right[i]=i+1;
left[n+1-i]=n-i; //³õʼ»¯Êý×é
}
left[n+1]=n;
for (int i=right[0];i!=n+1;i=right[i])
{
printf("%d\t",num[i]);
}
while(m--)
{
int com,a,b;
scanf("%d",&com);
// printf("++\n");
if(com==1)
{
scanf("%d %d",&a,&b);
move_left(a,b);
for (int i=right[0];i!=n+1;i=right[i])
{
// printf("%d\n",com);
printf("%d\t",num[i]);
}
}
if(com==2)
{
scanf("%d %d",&a,&b);
move_right(a,b);
for (int i=right[0];i!=n+1;i=right[i])
{
printf("%d\t",num[i]);
}
}
if(com==3)
{
scanf("%d %d",&a,&b);
swaP(a,b);
for (int i=right[0];i!=n+1;i=right[i])
{
printf("%d\t",num[i]);
}
}
if(com==4)
{
rev(n);
// reve++;
for (int i=right[0];i!=n+1;i=right[i])
{
printf("%d\t",right[i]);
}
}
}
int ct=1,sm=0;
for (int i=right[0];i!=n+1;i=right[i])
{
// printf("%d\t",num[i]);
if(ct++%2)
sm+=num[i];
}
printf("Case %d: %d\n",cs++,sm);
}
return 0;
}