---------------------------------琪露诺的排序---------------------------------------------
描述
笨蛋琪露诺喜欢用冰块搭积木。这天她用她的能力制造了N根冰柱作为材料,但这些冰柱显得参差不齐,不过好在她
知道这些冰柱的高度。患有强迫症的小妖精琪露诺决定将这N根冰柱从小到大排列,不幸的是,琪露诺是个笨蛋,她
只能将相邻的两根冰柱调换位置。现在她想知道她最少需要进行几次调换才能使这些冰柱变得有序。
输入
输入共两行。
第一行N(0<N<=500000),代表冰柱的个数。
第二行N个数,代表每根冰柱的高度hi(0<hi<2^32)
输出
一个整数,代表琪露诺最少的调换次数。
输入样例 1
4
4 3 2 1
输出样例 1
6
#include<cstdio>
#include<iostream>
using namespace std;
int n,a[500010],c[500010];
long long ans;
void msort(int b,int e)
{
if(b==e)
return;
int mid=(b+e)/2,i=b,j=mid+1,k=b;
msort(b,mid),msort(mid+1,e);
while(i<=mid&&j<=e)
if(a[i]<=a[j])
c[k++]=a[i++];
else
c[k++]=a[j++],ans+=mid-i+1;//当左边有一个数a比右边b大时,左边大于a的数都比b大
while(i<=mid)
c[k++]=a[i++];
while(j<=e)
c[k++]=a[j++];
for(int l=b;l<=e;l++)
a[l]=c[l];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
msort(1,n);
printf("%lld",ans);
return 0;
}
总结:
逆序对的题,就是找出序列数比其小,但值比其大的数。用常规方法做需要看数据量,数据量大则会超时。一般来说都是用归并排序来求解。每发现左边一个数大于右边的数,那么左边比这个数大的数,肯定大于此时右端的数。将左边剩余数的数量加起来即可。