http://acm.hdu.edu.cn/showproblem.php?pid=3743
测试模板的一道题,蛮好的。
敲了两种板子,白书上的第一种板子有点问题,改了一下,还是不太理解。
第二种网上的好理解。
#include <iostream>
#include<stdio.h>
#include<cstring>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
long long cnt=0;
//void merge_sort(int* A,int x,int y,int* T)
//{
// if(y-x>1) //!包括x,不包括y
// {
// int m=x+((y-x)>>1);
// int p=x,q=m,i=x;
// merge_sort(A,x,m,T);
// merge_sort(A,m,y,T);
// while(p<m||q<y)
// {
// if(q>=y||(p<m&&A[p]<=A[q]))
// T[i++]=A[p++];
// else
// {
// T[i++]=A[q++];
// cnt+=abs(m-p);
// }
// }
// for(int i=x;i<y;i++)
// A[i]=T[i];
// }
// else if(A[x]>A[y])
// {
// swap(A[x],A[y]);
// cnt++;
// }
//}
void merge_sort(int* A,int x,int y,int* T)
{
if(x==y) return;
int mid=(x+y)>>1,i,j,k;
i=x,k=x,j=mid+1;
merge_sort(A,x,mid,T);
merge_sort(A,mid+1,y,T);
while(i<=mid&&j<=y)
{
if(A[i]<=A[j]) T[k++]=A[i++];
else cnt+=mid-i+1,T[k++]=A[j++];
}
while(i<=mid) T[k++]=A[i++];
while(j<=y) T[k++]=A[j++];
for(int i=x;i<=y;i++)
A[i]=T[i];
}
int source[1000008],t[1000008];
int main()
{
int num;
while(scanf("%d",&num)!=EOF)
{
cnt=0;
for(int i=0;i<num;i++)
{
scanf("%d",&source[i]);
}
merge_sort(source,0,num-1,t);
printf("%I64d\n",cnt);
}
return 0;
}