题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
输入:
每个测试案例包括两行:
第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。
样例输入:
4
7 5 6 4
样例输出:
5

总的想法是归并排序,但是在计算逆序对时,有些小问题要考虑,不能漏掉某些元素,一种比较好的做法就在归并时当遇到第一个v[left] > v[right]时,cnt += 所有左边的left以后的元素的个数,而不是cnt += 1。代码如下:

 #include <iostream>
#include <vector>
#include <cstdio>
using namespace std; int n;
vector<int> v;
unsigned long long cnt; void merge(vector<int> &v, int low, int mid, int high) {
if (high <= low) return;
vector<int> tmp(high - low + );
int idx1 = low, idx2 = mid + ;
int idx = ;
while (idx1 <= mid && idx2 <= high) {
if (v[idx1] > v[idx2]) {
tmp[idx++] = v[idx2++];
cnt += mid - idx1 + ;
} else {
tmp[idx++] = v[idx1++];
}
} if (idx1 > mid)
while (idx < tmp.size()) tmp[idx++] = v[idx2++]; if (idx2 > high) {
while (idx < tmp.size()) tmp[idx++] = v[idx1++];
} idx = ;
while (idx < tmp.size())
v[low+idx] = tmp[idx++];
} void mergeSort(vector<int> &v, int low, int high) {
if (high <= low) return;
int mid = (low + high) / ;
mergeSort(v, low, mid);
mergeSort(v, mid + , high);
merge(v, low, mid, high);
} int main() {
//freopen("a.in", "r", stdin);
while (cin >> n) {
v.resize(n);
cnt = ;
for (int i = ; i < n; ++i) {
cin >> v[i];
}
mergeSort(v, , v.size() - );
cout << cnt << endl;
}
return ;
}
/**************************************************************
Problem: 1348
User: hupo250
Language: C++
Result: Accepted
Time:200 ms
Memory:2500 kb
****************************************************************/

[Jobdu] 题目1348:数组中的逆序对的更多相关文章

  1. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  2. 九度OJ 1348 数组中的逆序对 -- 归并排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1348 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求 ...

  3. 【剑指offer】题目36 数组中的逆序对

    数组中任取两个数字,如果前面的数字大于后面的数字称为一个逆序对 如:1,2,1,2,1 有3个逆序对 思路:知道O(N2)肯定是错的.开始想hash,试图找到O(n)的算法,想了很久,找不到.后来想到 ...

  4. 九度oj 1348 数组中的逆序对

    原题链接:http://ac.jobdu.com/problem.php?pid=1348 归并排序求逆序对... #include<algorithm> #include<iost ...

  5. [jobdu]数组中的逆序对

    http://ac.jobdu.com/problem.php?pid=1348 数组中的逆序对也是个常见的题目,算法导论中也有一些描述,参考:http://www.cnblogs.com/wuyue ...

  6. 【剑指Offer面试编程题】题目1348:数组中的逆序对--九度OJ

    题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组 ...

  7. 九度oj题目1348:数组中的逆序对

    题目1348:数组中的逆序对 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2572 解决:606 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序 ...

  8. 九度oj 题目1348:数组中的逆序对

    题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组 ...

  9. 九度OJ 1348:数组中的逆序对 (排序、归并排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2777 解决:656 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组 ...

随机推荐

  1. Gulp插件less的使用

    1.创建:gulpfile.js var gulp = require('gulp'), less = require('gulp-less'); gulp.task('default', funct ...

  2. asp.net core更进内容

    ASP.NET Core 是对 ASP.NET 的一次意义重大的重构.本文介绍了 ASP.NET Core 中的一些新概念,并且解释了它们如何帮助你开发现代的 Web 应用程序. 章节: 什么是 AS ...

  3. MySQL round函数

    在mysql中,round函数用于数据的四舍五入,它有两种形式: 1.round(x,d)  ,x指要处理的数,d是指保留几位小数 这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整 ...

  4. HBase系统架构及数据结构(转)

    原文链接:Hbase系统架构及数据结构 HBase中的表一般有这样的特点: 1 大:一个表可以有上亿行,上百万列 2 面向列:面向列(族)的存储和权限控制,列(族)独立检索. 3 稀疏:对于为空(nu ...

  5. 纯CSS(无 JavaScript)实现的响应式图像显示

    有许多方法可以实现web页面里图像的应答.然而,我碰到的所有方案都使用了JavaScript.这使我疑惑不用JavaScript实现图像响应是否可行. 我提出了下面纯CSS的方案. 它是如何工作的呢? ...

  6. C++primer习题--第1章

    本文地址:http://www.cnblogs.com/archimedes/p/cpp-primer-chapter1-ans.html,转载请注明源地址. [习题 1.3] 编一个程序,在标准输出 ...

  7. 【Python】Django CSRF问题

    参考资料: Django Ajax CSRF 认证:http://www.ziqiangxuetang.com/django/django-csrf.html Python Post遇到csrftok ...

  8. Event.RESIZE 的事件不触发

    stage.scaleMode=StageScaleMode.NO_SCALE;(或者设置其他缩放模式,如EXACT_FIT等):   如果没有设置 stage的缩放模式的话, stage.addEv ...

  9. 隐马尔科夫模型(Hidden Markov Models)

    链接汇总 http://www.csie.ntnu.edu.tw/~u91029/HiddenMarkovModel.html 演算法笔记 http://read.pudn.com/downloads ...

  10. Dreamweaver如何设置自动换行,修改字体

    1 打开和关闭自动换行功能 查看-代码视图选项 2 调整字体大小和类别