洛谷P1908 逆序对【递归】
题目:https://www.luogu.org/problemnew/show/P1908
题意:给定一个数组,求逆序对个数。
思路:
是一个很经典的题目了。通过归并排序可以求逆序对个数。
现在有一个区间,假设左半部分和右半部分都已经有序了,我们要将他们合并成一个区间。
只需要一个一个比较左半部分当前指向的数和右半部分当前指向的数,哪个小哪个在前就行了。
如果现在左半部分当前的数比右半部分当前的数要大的话,那么左半部分剩余的数也要比右半部分当前的数大,他们都可以和右半部分当前的数构成逆序。
所以我们可以通过归并排序计算逆序对的数量。
对于一个区间,先对左半部分和右半部分排序,排序完成后将他们合并并统计逆序对数量就行了。
注意这道题要适用long long
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue> #define inf 0x7f7f7f7f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int n;
const int maxn = 5e5 + ;
int num[maxn];
int t[maxn];
LL ans = ; void msort(int l, int r)
{
if(l == r)return;
int mid = (l + r) / ;
msort(l, mid);
msort(mid + , r);
//合并
int i = l, j = mid + , k = l;
while(i <= mid && j <= r){
if(num[i] <= num[j])t[k++] = num[i++];
else{
t[k++] = num[j++];
ans += (LL)mid - i + ;
}
}
while(i <= mid)t[k++] = num[i++];
while(j <= r)t[k++] = num[j++];
for(int i = l; i <= r; i++){
num[i] = t[i];
}
} int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d", &num[i]);
}
msort(, n);
printf("%lld\n", ans); return ;
}
洛谷P1908 逆序对【递归】的更多相关文章
- 洛谷P1908 逆序对
P1908 逆序对 2.2K通过 4.4K提交 题目提供者该用户不存在 标签云端 难度普及/提高- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 归并排序党注意了!数组要开… ...
- 洛谷 P1908 逆序对(归并排序解法)
树状数组解法:https://www.cnblogs.com/lipeiyi520/p/10846927.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...
- 洛谷P1908 逆序对(线段树解法)
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- 洛谷 P1908 逆序对 Label:归并排序||树状数组 不懂
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- 洛谷 P1908 逆序对
\[传送门qwq\] 题目描述 猫猫\(TOM\)和小老鼠\(JERRY\)最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计. 最近,\(TOM\)老猫查阅 ...
- 洛谷P1908 逆序对 [权值线段树]
题目传送门 逆序对 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的 ...
- 洛谷—— P1908 逆序对
https://www.luogu.org/problem/show?pid=1908 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏, ...
- 洛谷 P1908 逆序对(树状数组解法)
归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...
- 洛谷P1908 逆序对(归并排序)
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
随机推荐
- VTK拾取网格模型上的可见点
消隐与Z-Buffer 使用缓冲器记录物体表面在屏幕上投影所覆盖范围内的全部像素的深度值,依次访问屏幕范围内物体表面所覆盖的每一像素,用深度小(深度用z值表示,z值小表示离视点近)的像素点颜色替代深度 ...
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...
- Android 四大组件 Service 服务
1.Service简单介绍 依照使用范围分类: 类别 优点 缺点 差别 应用 本地服务 Local Service 本地服务在一定程度上节约了资源,另外本地服务由于是在同一进程,因此不须要IPC,也 ...
- java框架篇---hibernate(一对多)映射关系
一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...
- SOLID原则 【转】
S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写. 面向对象设计的原则 SRP The Single ...
- Vue.js常用指令:v-bind
一.什么是v-bind指令 v-bind指令用于响应更新HTML特性,允许将一个或多个属性动态绑定到表达式.v-bind是应用在动态属性上面的. 二.语法 v-bind语法如下: v-bind:动态属 ...
- Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明
本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...
- Java如何使服务器允许连接到套接字端口?
在Java编程中,如何使服务器允许连接到套接字端口? 以下示例显示如何使服务器通过使用ServerSocket类的server.accept()方法和Socket类的sock.getInetAddre ...
- Linux磁盘概念及其管理工具fdisk
Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区 作者:chawan [字体:大 中 小] 引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...
- Cisco VLAN ACL配置
什么是ACL? ACL全称访问控制列表(Access Control List),主要通过配置一组规则进行过滤路由器或交换机接口进出的数据包, 是控制访问的一种网络技术手段, ACL适用于所有的被路由 ...