2022-11-02 Acwing每日一题
逆序对的个数
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数 n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤100000,
数列中的元素的取值范围 [1,109]。
输入样例:
6
2 3 4 5 6 1
输出样例:
5
个人解析:
根据题意可知这是一道求逆序对的题,我想第一次碰到这种题都是暴力求解吧,但这里我们其实也可以使用归并排序和树状数组(不会),因此我也只能先用归并排序求解一遍了。
算法实现:
主要就是归并排序,只不过多了一行代码罢了。,其主要思想在于分治和单调性。
那么我们先来看归并排序的实现:
1.先将数组从中间一分为二,形成两个子数组,然后不断递归分割下去,直到剩下一个数时停止。不断对递归过程中产生的左右两个子数组进行合并排序(这里可以使用双指针优化),记住我们是先递归再优化,因此数组长度是从小到大。如当两个数组长度为2时,对其进行合并排序成一个长度为4的数组,如果数组长度不是偶数,则根据向下取整的特性选取中点。除此之外,左右两个子数组也都是单调的,毕竟是先排序再合并的。
2.在第1步使用双指针排序数组,即先创建一个temp数组作为中间数组,将左数组的一个数与右数组的一个数进行比较,谁小谁先放进temp(升序),直至某一个数组排序完成就退出排序过程,但如果另一个数组依然存在数的话,也一定是较大的,直接接到temp数组后面即可。
3.用排序后的新数组temp覆盖掉原来对应位置上的旧数组就相当于完成了对这一部分的合并排序,并将其用在后续的排序中。
需要格外注意的是,基于单调性我们可以知道当左数组存在一个数x比右数组的一个数y要大时,那么由于左数组是单调递增的,则从x往后的所有数都比y要大,因此逆序对的个数是从x开始到左子数组结束,也就是mid-i+1(i是x在左子数组中的下标)
代码实现:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
void merge_sort(int q[],int l,int r,long long *ans){
if(l >= r) return ;
int tmp[100000];
int mid = (l+r) >> 1;
merge_sort(q,l,mid,ans);
merge_sort(q,mid+1,r,ans);
int i=l,j = mid+1,cnt = 0;
while(i <= mid && j <= r){
if(q[i] <= q[j]){
tmp[cnt ++] = q[i++];
}
else{
tmp[cnt ++] = q[j++];
*ans += mid - i + 1; // 分治+单调即可
}
}
while(i <= mid) tmp[cnt++] = q[i++];
while(j <= r) tmp[cnt++] = q[j++];
for(i=l,j=0; i<=r ; ++i, ++j){
q[i] = tmp[j];
}
}
int main()
{
long long ans = 0;
int a[100000] = {0};
int n;
cin >> n;
for(int i=0; i < n ; ++i) cin >> a[i];
merge_sort(a,0,n-1,&ans);
printf("%lld",ans);
return 0;
}
2022-11-02 Acwing每日一题的更多相关文章
- CISP/CISA 每日一题 11
CISA 每日一题(答) 一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓 ...
- 老男孩IT教育-每日一题汇总
老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...
- 【Java每日一题】20161122
package Nov2016; import java.util.ArrayList; import java.util.Iterator; public class Ques1122 { publ ...
- 【Java每日一题】20170222
20170221问题解析请点击今日问题下方的“[Java每日一题]20170222”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...
- PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数
PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数 最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可 ...
- CISP/CISA 每日一题 五
CISA 每日一题(答) 信息系统审计师要确认系统变更程序中的: 1.变更需求应有授权.优先排序及跟踪机制: 2.日常工作手册中,明确指出紧急变更程序: 3.变更控制程序应同时为用户及项目开发组认可: ...
- [每日一题]ES6中为什么要使用Symbol?
关注「松宝写代码」,精选好文,每日面试题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目 ...
- [每日一题]面试官问:谈谈你对ES6的proxy的理解?
[每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
- 【js】Leetcode每日一题-完成所有工作的最短时间
[js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...
- 【JavaScript】Leetcode每日一题-青蛙过河
[JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...
随机推荐
- SpringBoot集成Thymeleaf发送Html邮件报错
由于业务需求需要使用Thymeleaf作为模板发送Html邮件,开发调试过程中发生以下错误 org.thymeleaf.exceptions.TemplateInputException: Error ...
- C/C++ Capstone 引擎源码编译
Capstone 是一个轻量级的多平台.多架构的反汇编框架.Capstone 旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎.Capstone的编译非常简单只需要一步即可轻松得到对应的Lib库文 ...
- Elasticsearch: Reindex接口
在我们开发的过程中,我们有很多时候需要用到Reindex接口.它可以帮我们把数据从一个index到另外一个index进行重新reindex.这个对于特别适用于我们在修改我们数据的mapping后,需要 ...
- Elasticsearch:Smart Chinese Analysis plugin
Smart Chinese Analysis插件将Lucene的Smart Chinese分析模块集成到Elasticsearch中,用于分析中文或中英文混合文本. 支持的分析器在大型训练语料库上使用 ...
- k8s集群中安装rook-ceph
容器的持久化存储 容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保 ...
- Android EGL 实践
本项目为 SurfaceView 和 TextureView 封装了 EGL 环境管理以及 Render 线程,可以和 GLSurfaceView 一样使用 OpenGLES 进行渲染.并尝试使用 O ...
- UDP协议编程
#接收代码 import socket # 使用IPV4协议,使用UDP协议传输数据 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定端口 ...
- Jmix 中 REST API 的两种实现
你知道吗,在 Jmix 中,REST API 有两种实现方式! 很多应用是采取前后端分离的方式进行开发.这种模式下,对前端的选择相对灵活,可以根据团队的擅长技能选择流行的 Angular/React/ ...
- Python中list列表的常见操作
Python的list是一个列表,用方括号包围,不同元素间用逗号分隔. 列表的数据项不需要具有相同的类型.(列表还可以嵌套,即列表中的列表) 每个元素都有一个索引(表示位置),从0开始:可以用索引-1 ...
- Skywalking Swck Agent注入实现分析
项目地址: GitHub - apache/skywalking-swck: Apache SkyWalking Cloud on Kubernetes 项目简介: A bridge project ...