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

题解:洛谷 P1908 逆序对

【题目来源】

洛谷:P1908 逆序对 - 洛谷

【题目描述】

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

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

【输入】

第一行,一个数 \(n\),表示序列中有 \(n\)个数。

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

【输出】

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

【输入样例】

6
5 4 2 6 3 1

【输出样例】

11

【算法标签】

《洛谷 P1908 逆序对》 #树状数组# #递归# #离散化# #排序#

【代码详解】

#include <bits/stdc++.h>
using namespace std;#define int long long  // 使用长整型
const int MAX_N = 500005;  // 定义数组最大长度
int n;                     // 数组长度
int a[MAX_N], b[MAX_N];    // a: 原始数组, b: 临时数组
int res;                   // 逆序对总数// 归并排序并统计逆序对
void merge(int l, int r)
{if (l >= r) return;    // 递归终止条件:区间长度为1int mid = (l + r) / 2; // 计算中点merge(l, mid);         // 递归处理左半部分merge(mid + 1, r);     // 递归处理右半部分// 合并两个有序区间并统计逆序对int i = l, j = mid + 1, k = l;while (i <= mid && j <= r){if (a[i] <= a[j])  // 左半部分元素小于等于右半部分b[k++] = a[i++];else               // 左半部分元素大于右半部分{b[k++] = a[j++];res += mid - i + 1;  // 统计逆序对数量}}// 处理剩余元素while (i <= mid) b[k++] = a[i++];while (j <= r) b[k++] = a[j++];// 将排序好的数据复制回原数组for (int i = l; i <= r; i++)a[i] = b[i];
}signed main()
{// 加速输入输出ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 输入数组长度和元素cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];// 调用归并排序计算逆序对merge(1, n);// 输出逆序对总数cout << res;return 0;
}
// 使用acwing的模板二刷
#include <bits/stdc++.h>
using namespace std;#define int long long  // 使用长整型
const int N = 500005;  // 定义数组最大长度
int n;                 // 数组长度
int q[N], tmp[N];      // q: 原始数组, tmp: 临时数组// 归并排序并统计逆序对数量
int merge_sort(int l, int r)
{if (l >= r) return 0;  // 递归终止条件:区间长度为1int mid = l + r >> 1;  // 计算中点int res = merge_sort(l, mid) + merge_sort(mid + 1, r);  // 递归处理左右子区间// 合并两个有序区间并统计逆序对int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r){if (q[i] <= q[j])  // 左半部分元素小于等于右半部分tmp[k++] = q[i++];else               // 左半部分元素大于右半部分{tmp[k++] = q[j++];res += mid - i + 1;  // 统计逆序对数量}}// 处理剩余元素while (i <= mid) tmp[k++] = q[i++];while (j <= r) tmp[k++] = q[j++];// 将排序好的数据复制回原数组for (int i = l, j = 0; i <= r; i++, j++)q[i] = tmp[j];return res;  // 返回当前区间的逆序对总数
}signed main()
{// 输入数组长度和元素cin >> n;for (int i = 1; i <= n; i++)cin >> q[i];// 调用归并排序并输出逆序对总数cout << merge_sort(1, n) << endl;return 0;
}

【运行结果】

6
5 4 2 6 3 1
11
http://www.jsqmd.com/news/394322/

相关文章:

  • 2026顶尖的口播文案智能体品牌公司排行
  • 支付宝消费券回收,闲券秒变零花钱 - 京顺回收
  • 2026上海展厅设计精选:口碑企业塑造独特品牌空间,展台搭建/会展/会场搭建/展位搭建/展览设计,展厅设计企业怎么选择 - 品牌推荐师
  • 沃尔玛购物卡交易平台大盘点:找到最快回收渠道! - 团团收购物卡回收
  • 完整教程:深度解析 Spring 框架核心代理组件 MethodProxy.java
  • 电赛九校联赛A题-信号测量笔记
  • 2026常州市口播文案智能体直销企业哪家好
  • 2026常州市靠谱的口播文案智能体平台
  • 沃尔玛购物卡快速回收技巧揭秘:高效、安全的解决方案 - 团团收购物卡回收
  • 沃尔玛购物卡回收避坑指南:如何找到正规渠道? - 团团收购物卡回收
  • 基于支持向量机(SVM)的时间序列预测(libsvm) 预测未来(递归) SVM时间序列递归 ...
  • PHP监狱服刑人员管理系统
  • PHP校园二手交易系统aqj3i--lw带商家
  • 安全快速!沃尔玛购物卡回收的实战经验分享 - 团团收购物卡回收
  • PHP校园失物招领管理系统 gtvcz
  • PHP新闻发布与管理系统用户可发布
  • PHP校内外美食推荐系统_rsss0
  • 如何选择最佳沃尔玛购物卡回收渠道?快速变现指南 - 团团收购物卡回收
  • 基于微信小程序的农事管理系统毕设源码
  • Flutter三方库适配OpenHarmony【flutter_speech】— 调试技巧与日志分析
  • 基于微信小程序的本科生交流培养管理平台毕设源码
  • 从1小时到10分钟:我如何用AI工具,高效“榨干”B站学习视频的全部价值?
  • PHP超市购物商城进销存系统小程序
  • 基于微信小程序的协同过滤电影推荐系统毕设源码
  • 基于微信小程序的农产品智慧物流系统毕设
  • 深度评测2026年:网站建设/微信小程序/APP开发公司/服务商怎么选?这5家综合实力领跑! - 深圳昊客网络
  • PHP课后延时托管管理系统PHP(选课,购买课程,请假)
  • 基于微信小程序的冷链物流系统毕设
  • PHP社区二手旧物交易系统
  • PHP社区智慧养老系统社区老年人医疗服务系统