当前位置: 首页 > news >正文

P1908 逆序对

P1908 逆序对

题目描述

猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。

最近,TOM 老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中 $a_i>a_j$ 且 $i<j$ 的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。注意序列中可能有重复数字。

Update:数据已加强。

输入格式

第一行,一个数 $n$,表示序列中有 $n$ 个数。

第二行 $n$ 个数,表示给定的序列。序列中每个数字不超过 $10^9$。

输出格式

输出序列中逆序对的数目。

输入输出样例 #1

输入 #1

6
5 4 2 6 3 1

输出 #1

11

说明/提示

对于 $25%$ 的数据,$n \leq 2500$。

对于 $50%$ 的数据,$n \leq 4 \times 10^4$。

对于所有数据,$1 \leq n \leq 5 \times 10^5$。

应该不会有人 $O(n^2)$ 过 50 万吧 —— 2018.8 chen_zhe。
`#include<bits/stdc++.h>
using namespace std;

define K 500005

int a[K], b[K];
long long int ans;

// 归并排序做
void Guibing(int x, int y) {
if (x == y)
return;
int mid = (x + y) / 2, i = x, j = mid + 1, k = x;
Guibing(x, mid);
Guibing(mid + 1, y);
while (i <= mid && j <= y) {
if (a[i] <= a[j]) {
b[k++] = a[i++];
} else {
b[k++] = a[j++];
ans += mid - i + 1;
}
}
// 处理左子数组剩余元素
while (i <= mid) {
b[k++] = a[i++];
}
// 处理右子数组剩余元素
while (j <= y) {
b[k++] = a[j++];
}
// 将辅助数组元素复制回原数组
for (int m = x; m <= y; m++) {
a[m] = b[m];
}
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
Guibing(1, n);
cout << ans;
return 0;
} 看大佬的半天才会点,下面是收获,下次再做时更新。 首先是归并排序是有递归和非递归两种方法,我这里只大概懂递归版,递归是自顶向下的,原理就是分割和归并两个大步骤, 以数列范围/2为中间值,向下取整,分成两块,然后分别定义几个特殊位置的变量,i为x为左区间第一位,j为右1,k用来临时数组赋值。 在分到最小区间,内数量为1,为有序,之后不断合并,Guibing(x, mid);Guibing(mid + 1, y);,最终分成两个大块,期间不断进行两个区间中最小数的比较, 小的放临时数组,个人觉得这个里面的i++等很妙,最终ans += mid - i + 1;原理是排好的两区间是有序,若左有大于右区间的,则左那个数后的数全大于右那个比较的数 while (i <= mid && j <= y) {
if (a[i] <= a[j]) {
b[k++] = a[i++];
} else {
b[k++] = a[j++];
ans += mid - i + 1;
}
}`
实现逆序对的计数。
剩下的几个while用于将多余的没有比对的两区间的数分别赋值临时数组,以左为先,最后再覆盖到原数组中。
归并完成。

http://www.jsqmd.com/news/472821/

相关文章:

  • Oracle 故障应急处理手册-RAC 投票盘(Voting Disk)故障恢复
  • Flutter 三方库 rabbit_converter 的鸿蒙化适配指南 - 让消息转换回归“工业化标准”,打造鸿蒙应用专家级的 RabbitMQ 数据适配中台
  • OpenClaw:打开文献综述宝库的钥匙——引用方法与技巧详解
  • SLAM公式中双竖线 ||·|| 表示什么意思?一文搞懂范数的含义
  • 甘肃2026上半年软考报名时间已出!
  • 院墙上的监控成摆设?避开这三个坑,不给骗子留机会!室外监控摄像头哪个品牌好
  • Boost源码分析: Serialization
  • 国产化解决方案!鼎讯信通 射频信号源模块 DXSL系列
  • 哺乳动物为什么不长绿毛
  • next-dbm:审批可控、部署高效,解锁数据构建更新新范式
  • 广西选物业律师实践经验分享,效果看得见!
  • 计算机毕业设计springboot基于Java的校园问题反馈系统 基于Spring Boot框架的高校师生诉求处理与服务平台的设计与实现 基于Java Web的校园意见收集与问题跟踪管理系统开发与应用
  • 鱼眼相机标定矫正详细步骤
  • 参观幼儿园前要做哪些准备?
  • 如何封装一个vue组件为hook函数
  • 皮皮宋渗透日记 09|业务逻辑漏洞全总结:登录 / 验证码 / 支付 / 找回密码 / 越权一网打尽
  • OpenClaw 使用指南:指令大集合
  • 数据结构:合并两个有序链表约瑟夫问题详解(C语言实现 + 图解思路)
  • 开源OpenClaw部署指南
  • openClaw实用Skill
  • master 节点 Java 环境安装操作总结
  • 【企业形象】优秀公司介绍PPT,远不止幻灯片!
  • 关于DeepSeek的详细介绍
  • OpenClaw数据安全深度分析:守护AI执行全流程,优选OPE本地部署
  • Flutter 三方库 dnsolve 的鸿蒙化适配指南 - 让网络寻址回归“高确定性”,打造鸿蒙应用专家级的 DNS 解析与全局网络调度底座
  • java深度学习【AI Infra】Pytorch ON Java 简介 学真算法 用真框架 做认真的人 掌握真本领
  • 【求助】穷学生想进linux do论坛
  • 奥尔特云智慧安保解决方案,安全运营“稳定器”
  • 714. 买卖股票的最佳时机含手续费
  • 现象级爆火:一只 “龙虾” 引发的全民狂欢