2299 归并排序
2011-05-24 21:04
99 查看
#include<iostream>
using namespace std;
#define max 5000005
int n,a[max],t[max];
long long sum;
void Merge(int x,int mid,int y)
{
int p=0;
int i=x,j=mid+1;
while(i<=mid && j<=y)
{
if(a[i]>a[j])
{
t[p++]=a[j++];
sum+=mid-i+1;//why?因为如果a[i] > a[j]的话,那么a[i]到a[m]之间的所有数都可以和a[j]构成逆序对。这句 是本题的核心。
//j-i是错的,这是只能用中间那个数
}
else
{
t[p++]=a[i++];
}
}
while(i<=mid) t[p++]=a[i++];
while(j<=y) t[p++]=a[j++];
for(int m=x;m<=y;m++)
a[m]=t[m-x];
}
void Mergesort(int i,int j)
{
if(j>i)
{
int mid=(i+j)/2;
Mergesort(i,mid);
Mergesort(mid+1,j);
Merge(i,mid,j);
}
}
int main()
{
while(cin>>n,n)
{
for(int i=0;i<n;i++)
cin>>a[i];
a
=0;
sum=0;
Mergesort(0,n-1);
cout<<sum<<endl;
}
return 0;
}
using namespace std;
#define max 5000005
int n,a[max],t[max];
long long sum;
void Merge(int x,int mid,int y)
{
int p=0;
int i=x,j=mid+1;
while(i<=mid && j<=y)
{
if(a[i]>a[j])
{
t[p++]=a[j++];
sum+=mid-i+1;//why?因为如果a[i] > a[j]的话,那么a[i]到a[m]之间的所有数都可以和a[j]构成逆序对。这句 是本题的核心。
//j-i是错的,这是只能用中间那个数
}
else
{
t[p++]=a[i++];
}
}
while(i<=mid) t[p++]=a[i++];
while(j<=y) t[p++]=a[j++];
for(int m=x;m<=y;m++)
a[m]=t[m-x];
}
void Mergesort(int i,int j)
{
if(j>i)
{
int mid=(i+j)/2;
Mergesort(i,mid);
Mergesort(mid+1,j);
Merge(i,mid,j);
}
}
int main()
{
while(cin>>n,n)
{
for(int i=0;i<n;i++)
cin>>a[i];
a
=0;
sum=0;
Mergesort(0,n-1);
cout<<sum<<endl;
}
return 0;
}
相关文章推荐
- poj-2299-Ultra-QuickSort-归并排序求逆序数--或树状数组
- POJ 2299 Ultra-QuickSort(归并排序)
- pku 2299 Ultra-QuickSort(求逆序,归并排序)
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- poj 2299 Ultra-QuickSort【归并排序求逆序数】
- poj-2299 Ultra—QuickSort(归并排序求逆序数)
- POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)
- poj-2299-Ultra-QuickSort(线段树 || 归并排序)
- poj 2299 逆序数 归并排序
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- poj 2299 归并排序求逆数
- poj 2299 利用归并排序求逆序数
- POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)
- POJ2299——Ultra-QuickSort(归并排序)
- POJ 2299 Ultra-QuickSort【求逆序数:归并排序|树状数组】
- 归并排序求逆序数(POJ 1804,POJ 2299,HDU 4911)
- poj 2299 Ultra-QuickSort【归并排序基础应用】
- poj2299 归并排序求逆序数
- pku 2299 Ultra-QuickSort 归并排序求逆序数
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)