考虑1,2,…,n (n <= 100000)的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序。
一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含有8个 逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。
现给定1,2,…,n的一个排列,求它的逆序数。

笨办法:O(n2)

分治O(nlogn):
1) 将数组分成两半,分别求出左半边的逆序数和右半边的逆序数
2) 再算有多少逆序是由左半边取一个数和右半边取一个数构成(要求O(n)实 现)

由归并排序改进得到,加上计算逆序的步骤

MergeSortAndCount: 归并排序并计算逆序数

代码:

#include<iostream>
using namespace std;
#define N 100000 + 5
int n;
int a[N];
int b[N];
int ans = 0;
void merge(int L, int R) {int mid = (L + R) / 2;int l = L;int r = mid+1;int count = 0;while(l <= mid && r <= R) {if(a[l] < a[r]) {b[count++] = a[r++];    } else {b[count++] = a[l++];ans += R - r + 1;}}while(l <= mid) b[count++] = a[l++];while(r <= R) b[count++] = a[r++];for(int i = L; i <= R; i++) a[i] = b[i-L];
}
void MergeSortAndCount(int L, int R) {if(L < R) {int mid = (L + R) / 2;MergeSortAndCount(L, mid);MergeSortAndCount(mid + 1, R);merge(L, R);}
}
int main() {scanf("%d", &n);for(int i = 0; i < n; i++) scanf("%d", &a[i]);MergeSortAndCount(0, n-1);printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/kindleheart/p/9416210.html

求排列的逆序数(分治)相关推荐

  1. 百练 求排列的逆序数

    百练 求排列的逆序数 总时间限制: 内存限制: 1000ms 65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信 ...

  2. poj求排列的逆序数

    此题为分治法归并 07:求排列的逆序数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对 ...

  3. 信息学奥赛一本通 1311:【例2.5】求逆序对 | 1237:求排列的逆序数 | OpenJudge NOI 2.4 7622:求排列的逆序数 | 洛谷 P1908 逆序对

    [题目链接] ybt 1311:[例2.5]求逆序对 ybt 1237:求排列的逆序数 OpenJudge NOI 2.4 7622:求排列的逆序数 洛谷 P1908 逆序对 ybt 1311,123 ...

  4. 信息学奥赛一本通(1237:求排列的逆序数)

    1237:求排列的逆序数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 6732     通过数: 2739 [题目描述] 在Internet上的搜索引擎经常需要 ...

  5. 45.分支算法练习:  7622:求排列的逆序数

    总时间限制: 1000ms 内存限制: 65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性 ...

  6. 求排列的逆序数(信息学奥赛一本通-T1237)

    [题目描述] 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务. 对于不同的排名结果可以用逆序来评价它 ...

  7. 1237:求排列的逆序数

    [题目描述] 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务. 对于不同的排名结果可以用逆序来评价它 ...

  8. 分治递归逆序数_[模板] 归并排序 逆序数 分治

    归并排序 图来自维基 递归调用的过程需要在脑中模拟清楚 然后是代码的细节问题 多复习多理解 刘汝佳版 #include using namespace std; const int MAXN = 1e ...

  9. 本题要求实现一个求整数的逆序数的简单函数。_回溯算法:求组合总和(二)...

    给「代码随想录」一个星标吧! ❝ 我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在 ...

最新文章

  1. OpenCV线特征Line Features
  2. VIM_shortcut_Cheat_sheet
  3. jquery mobile 从一个html的page跳转到另一个html的page
  4. Lua 的table遍历 【转】
  5. 【CCF】201709-1打酱油
  6. TikZ绘图示例——尺规作图:任意等分半圆弧
  7. php当前月每天时间戳,php获取当前月与上个月月初及月末时间戳的方法
  8. 关于办公室打印机纸张方向的问题
  9. 架构之美第八章-软件架构的含义
  10. The English (Porter2) stemming algorithm
  11. vue路由守卫及运用场景
  12. Xenserver命令大全
  13. php如何做防抖,Vue中怎么对事件进行防抖和节流操作?
  14. 联想F360移动硬盘拆解
  15. 程序猿想平稳度过35岁中年危机?不妨试着考个研
  16. JS如何改变元素内容?
  17. py 爬取汽车之家新闻案例
  18. 计算机语言phal语言,2.7 PhalApi 2.x 国际化
  19. 为什么有的程序员能力一般却能拿到好offer?
  20. netstat -i FLG含义

热门文章

  1. Real World Haskell 第七章 I/O
  2. ChineseCalendar类[转]
  3. MD5 - Bump Mapping
  4. 《OpenCV3编程入门》学习笔记5 Core组件进阶(四)图像对比度、亮度值调整
  5. android手机播放pc音乐播放器,最强手机音乐播放器?Foobar2K安卓版体验
  6. tensorboard merge报错_什么是TensorBoard?
  7. qq企业邮箱 java发送_spring配置javamail利用qq企业邮箱发送邮件。
  8. java 流的方式抓取网页 但是显示不全_用java抓取网页源代码时总是无法获取完整的源代码信息,求指导...
  9. 中jsp加载不出来layui_为何渔具厂生产不出来钓鱼人理想中的鱼竿呢,厂家说臣妾做不到啊...
  10. 用代码优雅的终止springboot服务