求逆序对 --- 归并排序水题
来源:互联网 发布:手机耳机话筒检测软件 编辑:程序博客网 时间:2024/06/07 06:26
题目描述 Description
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目
数据范围:N<=105。Ai<=105。时间限制为1s。
输入描述 Input Description
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
输出描述 Output Description
所有逆序对总数.
样例输入 Sample Input
4
3
2
3
2
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
解题报告:
此题只需在判断如果比较的时候后一个比前一个小就是逆序对数了吧,因此只需加一个计数的变量就好了,
在此还有一个重点就是,此题的数据量大,因此数据用long long .
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[100010],temp[100010],n;
long long sum;
long long merge(int *a,int l,int m,int r,int *b)
{
int i=l,k=l,j=m+1;
long long sum=0;
memcpy(b+l,a+l,sizeof(int)*(r-l+1));
while(i<=m&&j<=r)
{
if(b[i]<=b[j])
a[k++]=b[i++];
else
{
a[k++]=b[j++];
sum+=(m-i+1);
}
}
while(i<=m)a[k++]=b[i++];
while(j<=r)a[k++]=b[j++];
return sum;
}
long long merge_sort(int *a,int l,int r,int *b)
{
long long sum=0;
if(l<r)
{
int m=(l+r)>>1;
sum+=merge_sort(a,l,m,b);
sum+=merge_sort(a,m+1,r,b);
sum+=merge(a,l,m,r,b);
}
return sum;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sum=merge_sort(a,1,n,temp);//统计逆序对数
cout<<sum<<endl;
return 0;
}
- 求逆序对 --- 归并排序水题
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对~~~
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- Load BitmapData
- hdu 1542 求矩形并的面积
- (转)sort && qsort
- 【组合数学】 HDOJ Turn the pokers
- hdu 4865 dp
- 求逆序对 --- 归并排序水题
- HDOJ 1234 开门人和关门人
- getRequestDispatcher()与sendRedirect()的区别
- 列表、集合与数组之间的转化
- 再封裝
- 暑期个人赛--第一场--C
- Duanxx的HEVC学习(二) HEVC测试代码环境搭建
- 人体暴露在太空中会爆炸?——谣言粉碎机
- 黑马程序员_类加载器