poj解题报告——2299
2015-01-11 15:02
405 查看
题目本质就是求逆序对,然后用归并排序就可以做了,冒泡也能做,但是超时,O(n^2)的算法相比于O(n*log(n))算法总是要差一点的。
代码如下
#include<stdio.h>
#include<stdlib.h>
#define MAX 500001
int n,a[MAX],t[MAX];
__int64 sum;
void Merge(int l, int m, int r)
{
int p=0;
int i=l,j=m+1;
while(i<=m&&j<=r)
{
if(a[i]>a[j])
{
t[p++]=a[j++];
sum+=m-i+1;
}
else
{
t[p++]=a[i++];
}
}
while(i<=m)
t[p++]=a[i++];
while(j<=r)
t[p++]=a[j++];
for(i=0;i<p;i++)
{
a[l+i]=t[i];
}
}
void MergeSort(int l,int r)
{
int m;
if(l<r)
{
m=(l+r)/2;
MergeSort(l,m);
MergeSort(m+1,r);
Merge(l,m,r);
}
}
void main()
{
int i;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
MergeSort(0,n-1);
printf("%I64d\n",sum);
}
}
代码如下
#include<stdio.h>
#include<stdlib.h>
#define MAX 500001
int n,a[MAX],t[MAX];
__int64 sum;
void Merge(int l, int m, int r)
{
int p=0;
int i=l,j=m+1;
while(i<=m&&j<=r)
{
if(a[i]>a[j])
{
t[p++]=a[j++];
sum+=m-i+1;
}
else
{
t[p++]=a[i++];
}
}
while(i<=m)
t[p++]=a[i++];
while(j<=r)
t[p++]=a[j++];
for(i=0;i<p;i++)
{
a[l+i]=t[i];
}
}
void MergeSort(int l,int r)
{
int m;
if(l<r)
{
m=(l+r)/2;
MergeSort(l,m);
MergeSort(m+1,r);
Merge(l,m,r);
}
}
void main()
{
int i;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
MergeSort(0,n-1);
printf("%I64d\n",sum);
}
}
相关文章推荐
- 【原】 POJ 2299 Ultra-QuickSort 逆序数 解题报告
- 解题报告——POJ 2299
- POJ 2299 解题报告
- nlogn求逆序数 POJ 2299解题报告
- POJ - 2299 Ultra-QuickSort解题报告
- poj 2299 归并排序求逆序对 解题报告
- poj2299解题报告(归并排序求逆序数)
- poj1042解题报告
- poj解题报告——1922
- POJ-1152 An Easy Problem! 解题报告(数论) 是不是N进制数
- POJ 3468.A Simple Problem with Integers 解题报告
- 【解题报告】POJ 1026 Cipher -- 置换群 轮换k次
- poj解题报告——3083
- 【POJ 1025 Department 解题报告】
- POJ1326解题报告
- poj 2585 Window Pains 解题报告
- poj2472解题报告——化用Dijkstra算法
- 【原】 POJ 1083 Moving Tables 解题报告
- 【原】 POJ 3126 Prime Path 筛素数+BFS单源无权最短路径 解题报告
- POJ1350解题报告