【洛谷】【归并排序】P1908 逆序对
【题目描述:】
猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。
【输入格式:】
第一行,一个数n,表示序列中有n个数。
第二行n个数,表示给定的序列。
【输出格式:】
给定序列中逆序对的数目。
【算法分析:】
定义:
对于序列a,如果i < j 且 a[i] > a[j],则称a[i]、a[j]为a序列的一组逆序对
由定义可知,一个长度为n的序列最多有n * (n - 1) / 2个逆序对,注意n的取值范围,一些情况下ans要开long long
冒泡求逆序对:
求逆序对可以用冒泡排序来做,每次交换相邻两个元素的时候逆序对的个数便增加一
冒泡排序(从小到大)其实就是通过消除逆序对来保证序列的有序性。
但是每次只找到一个逆序对效率太低,时间复杂度O(n2)
归并排序求逆序对:
还有一种稳定的排序算法:归并排序,也可以用来求逆序对的数量
假设[l, mid]区间内的元素构成集合A,[mid + 1, r]内的元素构成集合B
由于A、B集合内的数字都是已经从小到大排好了的,
所以如果Ai > Bj ,即这两个元素能够构成一个逆序对,
则 A[i, mid] 中的所有元素都可以和Bj构成逆序对
这样子就找到了一组一组地求逆序对的方法,时间复杂度O(nlog2n)
【代码:】
//归并排序求逆序对
#include<iostream>
#include<cstdio>
using namespace std; const int MAXN = + ; int n, a[MAXN], tmp[MAXN];
long long ans; void Merge_sort(int l, int r) {
if(l == r) return;
int mid = (l + r) >> ;
Merge_sort(l, mid);
Merge_sort(mid + , r);
int i, j, cnt = l;
for(i = l, j = mid + ; i <= mid; i++) {
for(; a[j] < a[i] && j <= r; j++)
tmp[cnt++] = a[j], ans += mid - i + ;
tmp[cnt++] = a[i];
}
for(; j <= r; j++) tmp[cnt++] = a[j];
for(i = l; i <= r; i++) a[i] = tmp[i];
}
int main() {
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d", &a[i]);
Merge_sort(, n);
printf("%lld\n", ans);
}
【洛谷】【归并排序】P1908 逆序对的更多相关文章
- 洛谷P1393 动态逆序对(CDQ分治)
传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ...
- 洛谷P3157 动态逆序对 [CQOI2011] cdq分治
正解:cdq分治 解题报告: 传送门! 长得有点像双倍经验还麻油仔细看先放上来QwQ! 这题首先想到的就直接做逆序对,然后记录每个点的贡献,删去就减掉就好 但是仔细一想会发现布星啊,如果有一对逆序对的 ...
- 洛谷P2513 [HAOI2009]逆序对数列
P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易 ...
- 洛谷P1521 求逆序对 题解
题意: 求1到n的全排列中有m对逆序对的方案数. 思路: 1.f[i][j]表示1到i的全排列中有j对逆序对的方案数. 2.显然,1到i的全排列最多有(i-1)*i/2对逆序对,而对于f[i][j]来 ...
- 洛谷 P1521 求逆序对
题目描述 我们说(i,j)是a1,a2,…,aN的一个逆序对当且仅当i<j且ai>a j.例如2,4,1,3,5的逆序对有3个,分别为(1,3),(2,3),(2,4).现在已知N和K,求 ...
- bzoj2431 || 洛谷P1521 求逆序对
考虑一下插⼊法 n<=100n<=100n<=100 f[i][j]f[i][j]f[i][j]表⽰111~iii的全排列有j个逆序对的⽅案数 f[i][j]=Σf[i−1][j−k ...
- 【洛谷P2513】逆序对数列
前缀和.滚动数组优化dp f[i][j]表示前i个数,逆序对数为j的方案数 我们知道,在第k个位置放第i个数,单步得到的逆序对数为i-k 则在前i个数,最多能产生的逆序对数为i个,最少0个,均可转移到 ...
- 洛谷P1908 逆序对【递归】
题目:https://www.luogu.org/problemnew/show/P1908 题意:给定一个数组,求逆序对个数. 思路: 是一个很经典的题目了.通过归并排序可以求逆序对个数. 现在有一 ...
- 洛谷P1908 逆序对
P1908 逆序对 2.2K通过 4.4K提交 题目提供者该用户不存在 标签云端 难度普及/提高- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 归并排序党注意了!数组要开… ...
随机推荐
- [javaSE] 网络编程(概述)
网络通信的步骤, 1.找到对方的ip 2.数据发送到对方指定的应用程序上,为了标识这些应用程序,用数字进行标识,这个数字就是端口 3.定义通信规则,这个规则就称为协议 国际组织定义了通用协议 TCP/ ...
- [javaSE] 类型转换(1加1等于几)
打印 ‘a’+1,输出98,解释:’a’是char类型占2个8bit,1是int类型占4个,’a’字符会被自动强制转换为int类型对应ascii码表97 打印’1’+1,输出 50,解释:’1’是ch ...
- IDEA下的第一个springBoot
1.第一步打开File->New->Project,SDK根据自己的需要选择,我这边选的是java7 2.Next之后 设置group 和artifact,根据自己的需要进行修改. 3.导 ...
- 动态We API(ABP官方文档翻译)
动态Web API层 创建动态Web API控制器 ForAll方法 重写ForAll ForMethods Http动词 WithVerb方法 HTTP特性 命名约定 API管理器 RemoteSe ...
- CodeForces760B
B. Frodo and pillows time limit per test:1 second memory limit per test:256 megabytes input:standard ...
- wamp 安装monggo扩展
1.下载对应的monggo扩展 http://pecl.php.net/package/mongo 2. 找对应的版本 放在D:\program\wamp\bin\php\php5.5.12\ext ...
- [移动端WEB] 移动端网站响应式布局之"rem",CSS3 rem使用方式
(function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...
- excel导入 服务器忘了装组件了。。。
excel导入 本地没问题 一直在找权限问题 最后发现服务器忘了装组件了... 郁闷 记录下 http://www.microsoft.com/zh-cn/download/confirmation ...
- 【vue】vue的路由权限管理
前言: 最近闲来无事浏览各种博客,看到了一个关于路由权限的管理,觉得很有用,针对那个博客,准备自己写一个demo. 实现: 路由大致分为用户路由<特定用户才能浏览>和基本路由<所有用 ...
- oracle的sequence出现gap的问题
转自 http://web4.blog.163.com/blog/static/189694131201132184850561/ 今天碰到一个问题,数据库表有一个字段的值是通过sequence来生成 ...