Codeforces Round #277.5 (Div. 2)-A

分析:这题很像Codefoces 432 C. Prime Swaps(水),我就直接处理数据强行用以前的思路做出来了。

在开始交换前的操作是按大小分别将每个数转化为其在递增序列中的序号,存入da,每个序号的现在位置放入pos。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<cstring>
#include<algorithm>
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define rev(i,a,b) for(int i=(a);i>=(b);i--)
#define clr(a,x) memset(a,x,sizeof a)
typedef long long LL;
using namespace std;

const int mod=1e9 +7;
const int maxn=3005;
const int maxm=4005;
int da[3005],pos[3005],u[maxn],v[maxn];
int main()
{
    int n,m;
    while(~scanf("%d",&n))
    {
        int scnt=0,y;double x;
        map<double,int>mp;
        rep(i,1,n+1)
        {
            scanf("%d",&y);x=y;
            while(mp[x])
                x+=0.0002;
            mp[x]=i;
        }

        map<double ,int>::iterator it;int d=0;
        for(it=mp.begin();it!=mp.end();++it)
            da[it->second]=++d,pos[d]=it->second;
        for(int i=1;i<=n;i++)
        {
            while(da[i]!=i)
            {
                int t=pos[i]-i+1;
                int tnp=pos[i],tmp=pos[i]-t+1;
                int tm=da[tnp];
                da[tnp]=da[tmp];
                da[tmp]=tm;
                tm=pos[da[tnp]];
                pos[da[tnp]]=pos[da[tmp]];
                pos[da[tmp]]=tm;
                u[scnt]=tnp;v[scnt++]=tmp;
            }
        }
        printf("%d\n",scnt);
        for(int i=0;i<scnt;i++)
            printf("%d %d\n",v[i]-1,u[i]-1);
    }
    return 0;
}


你可能感兴趣的:(Codeforces Round #277.5 (Div. 2)-A)