题目链接:https://vjudge.net/contest/350168#problem/A
参考链接:https://www.cnblogs.com/birchtree/p/10962041.html
思路:
以1或n为中转节点,交换,所以交换一个值所需要最大的次数为3,总结果最大是3×(n-2)+1。
最后的+1代表如果最终a1 != 1,就将a1,an交换。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5+10;
int a[N],n,pos[N] = {0},tot = 0;
struct Node { int x,y; Node(){} Node(int x1,int y1) { x = x1;y = y1; } }cur[N<<2];
int tmp(int x)
{
if(x-1>=n/2) return 1;
return n;
}
void Swap(int x,int y)
{
cur[++tot] = Node(x,y);
swap(pos[ a[x] ],pos[ a[y] ]); swap(a[x],a[y]);
}
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]); pos[ a[i] ] = i;
}
for(int i=2;i<n;i++){
int tp = pos[i];
Swap(tp,tmp(tp));
if(tmp(tp) != tmp(i)) Swap(tmp(tp),tmp(i));
Swap(i,tmp(i));
}
if(a[1] != 1) Swap(1,n);
printf("%d\n",tot);
for(int i=1;i<=tot;i++) printf("%d %d\n",cur[i].x,cur[i].y);
//for(int i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}