要在中间插入,用数组的话要全体向后移一位。显然复杂度肯定爆了!那就用链表吧。
由于复杂度的问题最烦的就是4操作。如果枚举把链表倒过来复杂度照样超。于是我们发现链表的顺序只对1、2操作的左右和最后输出有影响。于是如果现在链表是倒着的并且执行1、2操作,那就换一下(是1则变2,否则变1)。输出的话如果 n n n是奇数的话怎么反转都是把奇数位加起来。但 n n n是偶数的话则分两种情况:
- 转了奇数次,相当于转了1次,输出偶数位
- 转了偶数次,相当于没转,输出奇数位
还有,如果3操作交换是,要特判两数相邻的情况,我卡了好久!
最后就上代码吧:
#include<stdio.h>
#include<iostream>
#define MAXN 100005
using namespace std;
int n,m;
struct Node
{
int data;
Node *pre;
Node *nxt;
Node()
{
nxt=pre=NULL;
data=-1;
}
};
Node *head,*tail,*zhi[MAXN];
int id,x,y;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
bool flag=0;
head=new Node;
tail=new Node;
head->nxt=tail;
tail->pre=head;
for(int i