| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:这个题测试数据不重要吧 关键看你怎么找出一种快速求逆序数的方法In Reply To:这个题测试数据不重要吧 关键看你怎么找出一种快速求逆序数的方法 Posted by:zzningxp at 2005-12-04 23:20:47 // 排序应该是没问题的,不知错哪里了
#include<iostream>
using namespace std;
long count;
__int64 c[500000];
void Merge(__int64 a[], long min, long mid, long max)
{
__int64 * b = new __int64 [max - min + 1];
long j = min, k = mid + 1;
long i = 0;
for(i = 0; j <= mid && k <= max; i++)
{
if(a[j] > a[k])
{
b[i] = a[k++];
count += mid - j + 1; //计算count
}
else
{
b[i] = a[j++];
}
}
if(j <= mid)
{
for(; j <= mid; j++)
b[i++] = a[j];
}
if(k <= max)
{
for(; k <= max; k++)
{
b[i++] = a[k];
}
}
for(i = 0,j = min; i < max - min + 1; i++,j++)
{
a[j] = b[i];
}
delete [] b;
}
void MSort(__int64 a[], long min, long max)
{
if(max == min)
{
return;
}
long mid = (max + min)/2;
MSort(a, min, mid);
MSort(a, mid + 1, max);
Merge(a, min, mid, max);
}
int main()
{
long num;
long i;
scanf("%ld", &num);
while(num > 0)
{
count = 0;
for(i = 0; i < num; i++)
{
scanf("%I64d", &c[i]);
}
MSort(c, 0, i-1);
//for(i = 0; i < num; i++)
// printf("%I64d ", c[i]);
// printf("\n");
printf("%ld\n", count);
scanf("%ld", &num);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator