news 2026/6/13 13:27:31

关于求逆序对总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于求逆序对总结

for循环遍历求解

这位是最简单也是时间复杂度最大的方法。

#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; int a[n]; for(int i=0; i<n; i++){ cin >> a[i]; } int count = 0; for(int i=0; i<n-1; i++){ for(int j=i+1; j<n; j++){ if(a[i] > a[j]) count++; } } cout << count << endl; }

归并排序求解

利用分治思想,不断将数组分为两半,分别排序后在合并。

在排序期间可将逆序对求出。

#include<bits/stdc++.h> using namespace std; const int MAXN = 5e5+5; int A[MAXN]; int n; long long ans = 0; void merge_sort(int l,int r){ if(l >= r) return;//只有一个元素,不需要排序 int mid = (l + r)/2; merge_sort(l,mid); merge_sort(mid+1,r); vector<int> buf; int x = l,y = mid + 1; while(x <= mid || y <= r){//还没有放入buf的元素 //A[x]先放入buf,A[x] <= A[y],A[y]已经没有了 if(y > r || (x <= mid && A[x] <= A[y])){ buf.push_back(A[x]);//可简化为 buf.push_back(A[x++]) x++; }else{ buf.push_back(A[y]); y++; ans += mid+1-x;//A[x]>A[y],记录逆序对个数 } } for(int i = l;i <= r;++i) A[i] = buf[i-l]; } int main(){ cin >> n; for(int i = 1;i <= n;++i) cin >> A[i]; merge_sort(1,n); /*--------------输出排序后的数组--------------*/ for(int i = 1;i <= n;++i) cout << A[i] << " "; /*--------------输出逆序对的个数--------------*/ cout << ans << endl; return 0; }

树状数组求解

求逆序对即求每个数i之前有多少比他大的数(设为bi),建立c数组后边转化为如何快速求c数组的区间和

1.数据离散化:99 5 35 --> 3 1 2

2.建立c[i]数组:c[i]代表当前值为i的数的个数,c数组不断统计a[i]并计算bi

3.快速求c数组的区间和:利用树状数组实现

关于lowbit()函数:返回二进制最后一个1与其后面的0.

#include<bits/stdc++.h> using namespace std; const int MAXN = 5*1e5+5; struct Node{ int num,id,newnum; }nodes[MAXN]; int N; int a[MAXN]; bool cmp1(const Node &a,const Node &b){ return a.num < b.num; } bool cmp2(const Node &a,const Node &b){ return a.id < b.id; } int lowbit(int x){ return x&-x; } void add(int x,int v){ while(x<=N){ a[x] += v; x += lowbit(x); } } int ask(int x){ int ans = 0; while(x){ ans += a[x]; x -= lowbit(x); } return ans; } int main(){ /*------------------存储数据------------------*/ scanf("%d",&N); for(int i = 1;i <= N;i++){ scanf("%d",&nodes[i].num);//记录数据 nodes[i].id = i;//记录数据的存储顺序 } /*----------------数据的离散化----------------*/ sort(nodes+1,nodes+N+1,cmp1);//按照数据大小排序 int cnt = 0; for(int i = 1;i <= N;i++){ if(nodes[i].num != nodes[i-1].num) cnt++; nodes[i].newnum = cnt; } sort(nodes+1,nodes+N+1,cmp2);//按照存储顺序排序,恢复原次序 /*-------------树状数组维护区间和-------------*/ long long ans = 0; for(int i = 1;i <= N;i++){ add(nodes[i].newnum,1); ans += ask(N) - ask(nodes[i].newnum); } printf("%lld",ans); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 22:52:40

Boost C++

一、Boost C 核心定位&#xff08;大白话解释&#xff09;Boost 就像 C 标准库的 “超集扩展包”—— 由全球顶尖 C 开发者维护&#xff0c;包含 100 个高质量、跨平台的工具库&#xff0c;填补了原生 C 标准库的功能空白&#xff08;比如网络、多线程、正则、序列化等&#x…

作者头像 李华
网站建设 2026/6/13 7:54:57

基于Java的园区咨询服务智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 园区咨询服务智慧管理系统结合了会员管理、项目管理和资源管理等多个功能模块&#xff0c;满足普通员工和部门领导的不同需求。系统涵盖21个主要字段属性的数据录入与统计分析&#xff0c;并采用SpringMVC开发框架配合MySQL数据库实现高效…

作者头像 李华
网站建设 2026/6/12 4:14:27

别再盲目迁移了!,Open-AutoGLM与LambdaTest迁移成本与风险全面预警

第一章&#xff1a;Open-AutoGLM 与 LambdaTest 功能差异在自动化测试与智能代码生成领域&#xff0c;Open-AutoGLM 与 LambdaTest 各自代表了不同的技术方向和应用场景。前者聚焦于基于大语言模型的自动化代码生成与逻辑推理&#xff0c;后者则专注于跨浏览器兼容性测试的云平…

作者头像 李华
网站建设 2026/6/13 12:53:39

剖析CVE-2024-58318:Kentico Xperience存储型XSS漏洞技术详解

CVE-2024-58318: Kentico Xperience 网页生成过程中输入净化不当导致的存储型跨站脚本漏洞 严重性: 中等 类型: 漏洞 CVE编号: CVE-2024-58318 漏洞描述 Kentico Xperience 中存在一个存储型跨站脚本漏洞&#xff0c;攻击者可通过页面和表单构建器中的富文本编辑器组件注入恶意…

作者头像 李华
网站建设 2026/6/12 23:16:19

光伏储能系统Simulink仿真:光照变化下的电源管理与负载调节策略研究

光伏储能离网系统simulink仿真 [1]光照在0.2s时候从1000变成200 光照1000时光伏给蓄电池和负载供电 光照200时&#xff0c;光伏和蓄电池同时给负载供电 [2]负载电阻的阻值可以修改&#xff0c;系统仍然能够实现最大功率点追踪&#xff0c;并且母线电压能够稳定在给定值&#xf…

作者头像 李华