题目大意:
解决:归并排序
#include <iostream>
#include <cstdio>
using namespace std;
int num[1000005];
int tmp[1000005];
long long total;
void merge(int beg,int mid,int end)
{
int i=beg,j=mid+1,k=0;
while(i<=mid && j<=end)
{//最关键的是下边这句话total+= mid-i+1;意思是前边比后边这个数大的个数
if(num[i]>num[j]){tmp[k++]=num[j++];total+= mid-i+1;}
else tmp[k++]=num[i++];
}
while(i<=mid)tmp[k++]=num[i++];
while(j<=end)tmp[k++]=num[j++];
for(i=0,j=beg;i<k;i++)num[j++]=tmp[i];
}
void solve(int beg,int end)
{
if(beg<end)
{
int mid=(beg+end)/2;
solve(beg,mid);
solve(mid+1,end);
merge(beg,mid,end);
}
}
int main()
{
int icase;
scanf("%d",&icase);
while(icase--)
{
int n;
total=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&num[i]);
solve(1,n);
printf("%lld\n",total);
}
system("pause");
return 0;
}
浙公网安备 33010602011771号