问题 C: Count Inversions
时间限制: 1 Sec 内存限制: 128 MB
提交: 19 解决: 5
题目描述
给一个数组,算inverted pair的数目
输入
有多组测试样例。每组输入数据占一行,每一行是一个数组,数组之间的元素用空格分开
输出
每组输出结果占一行。对应于每组输入数据的inversions
样例输入
1 2 3 2 1 3 3 2 1
样例输出
0 1 3
经验总结
这一题还是求逆序数。。。不过要对输入进行处理,输入的处理可能是会出错的地方,后面的求逆序数,还是利用归并排序的思想,在排序过程中累加逆序数的数量,排序完成后,累加结果即为数列的逆序数
正确代码
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
const int maxn=500010;
int a[maxn],b[maxn];
long long num;
void Merge(int a[],int start,int mid,int end)
{
int i=start,j=mid+1,k=start;
while(i<=mid&&j<=end)
{
if(a[i]<=a[j])
{
b[k++]=a[i++];
}
else
{
num+=j-k;
b[k++]=a[j++];
}
}
while(i<=mid)
{
b[k++]=a[i++];
}
while(j<=end)
{
b[k++]=a[j++];
}
for(int i=start;i<=end;i++)
{
a[i]=b[i];
}
}
void MergeSort(int a[],int start,int end)
{
if(start<end)
{
int mid=(start+end)/2;
MergeSort(a,start,mid);
MergeSort(a,mid+1,end);
Merge(a,start,mid,end);
}
}
int main()
{
int n;
string str;
while(getline(cin,str))
{
n=0;
while(str.length())
{
int pos=str.find(" ");
if(pos==string::npos)
{
sscanf(str.c_str(),"%d",&a[n]);
break;
}
else
sscanf(str.substr(0,pos).c_str(),"%d",&a[n]);
++n;
str.erase(0,pos+1);
}
num=0;
MergeSort(a,0,n);
printf("%lld\n",num);
}
return 0;
}