帮挂科

Time Limit: 2000/1000ms (Java/Others) 64bit IO Format: %lld & %llu

Problem Description:

冬瓜发现期末很多人都挂了线代,他决定写个程序帮挂科的同学。在一个排列中,如果一对数的前后位置与大小
顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
可是冬瓜想的头发都掉光了,聪明的你肯定能够帮帮他。

Input:

输入有多组
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)

Output:

输出逆序数

Sample Input:

4
2
4
3
1

Sample Output:

4
解题思路:这里用归并排序求逆序数。主要是将序列分成两部分,只要在有序的前半部分中找到的下标i比后半部分下标j大,那么下标i~m都可以构成逆序数对,即有(m-i+1)对,再合并子序列即可。。。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
const int N=;
int ans,n,a[N],tmp[N];//tmp是临时数组
void _merge(int l,int m,int r)//合并子序列
{
int i=l,j=m+,k=l;
while(i<=m && j<=r){
if(a[i]>a[j]){
tmp[k++]=a[j++];//从小到大排列
ans+=m-i+;//只要a[i]>a[j],i~m都可以构成逆序数
}
else tmp[k++]=a[i++];//相等的就直接存放到临时数组
}
while(i<=m)tmp[k++]=a[i++];//剩余的直接拷贝
while(j<=r)tmp[k++]=a[j++];
for(int i=l;i<=r;++i)
a[i]=tmp[i];//临时数组赋值给a数组
}
void _merge_sort(int l,int r)//归并排序
{
if(l<r){
int m=(l+r)>>;//分成两部分
_merge_sort(l,m);//左递归
_merge_sort(m+,r);//右递归
_merge(l,m,r);//合并两部分
}
}
int main()
{
while(cin>>n){
for(int i=;i<n;++i)
cin>>a[i];
ans=;
_merge_sort(,n-);
cout<<ans<<endl;
}
return ;
}

ACM_逆序数(归并排序)的更多相关文章

  1. hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)

    题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...

  2. HDU 4911 Inversion (逆序数 归并排序)

    Inversion 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/A Description bobo has a sequen ...

  3. 51nod1019逆序数(归并排序/树状数组)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1019 题意:中文题诶- 思路: 方法1:归并排序- 归并排序过 ...

  4. 51Nod 1019 逆序数 (归并排序)

    #include <iostream> #include <cstring> using namespace std; ; int a[maxn]; int res[maxn] ...

  5. 求逆序数的方法--线段树法&归并排序法

    逆序数的概念:对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆 ...

  6. poj 2299 逆序数

    http://poj.org/problem?id=2299 坑:答案是long long 输出……!!!!! 题意是:求一个数组进行冒泡排序交换的次数 题解:求逆序数 题解Ⅰ: 归并排序求逆序数 归 ...

  7. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  8. POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树

    题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...

  9. poj 1804 (nyoj 117)Brainman : 归并排序求逆序数

    点击打开链接 Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7810   Accepted: 4261 D ...

随机推荐

  1. IEnumerator<TItem>和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了

    IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要 ...

  2. iOS开发人员:事实上你还有非常多东西须要学

    iOS 新特性总结(since iOS6) iOS 6 1.废除viewDidUnLoad 收到内存警告须要到didReceiveMemoryWarning中处理 [小技巧] -(void)didRe ...

  3. Linux—read

    read:将信息读入一个或多个Shell变量    语法格式:read [-r] 变量名    选项:        -r:原始读入,不做任何处理,不将结尾结尾处的反斜杠解释为续行字符    行为模式 ...

  4. Spark调研笔记第3篇 - Spark集群相应用的调度策略简单介绍

    Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明. 1. 应用间调度 1) 调度策略1: 资源静态分区 资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分 ...

  5. 【iOS进阶】UIWebview加载搜狐视频,自动跳回客户端 问题解决

    UIWebview加载搜狐视频,自动跳回搜狐客户端 问题解决 当我们用UIWebview(iOS端)加载网页视频的时候,会发现,当真机上有搜狐客户端的时候,会自动跳转到搜狐客户端进行播放,这样的体验对 ...

  6. HOSVD高阶奇异值分解

    高阶奇异值分解(High Order Singular Value  Decomposition,   HOSVD) 奇异值分解SVD(Singular Value Decomposition)是线性 ...

  7. 自己写好的pdo数据库抽象层 mysql为例

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/31787719 class pdo_dat ...

  8. linux网络socket 接口转

    linux网络socket 接口 1.socket函数:一个进程必须做的第一件事就是调用socket函数获得一个文件描述符. ------------------------------------- ...

  9. HDU3038 How Many Answers Are Wrong —— 带权并查集

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 200 ...

  10. Lucene 4.X 倒排索引原理与实现: (3) Term Dictionary和Index文件 (FST详细解析)——直接看例子就明白了!!!

    转自: http://www.cnblogs.com/forfuture1978/p/3945755.html 好好看看吧 倒排列表信息中词典相关存储的最关键格式 占倒排列表中文件大小的多数 我们来看 ...