CodeForces - 1148C (脑洞)

题目链接: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;
}
发布了438 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/103806338