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

关于求逆序对总结

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; }
http://www.rkmt.cn/news/131726.html

相关文章:

  • 详细介绍:Elasticsearch集群部署实战指南
  • Open-AutoGLM集成Sauce Labs常见报错,5分钟定位并解决的终极方案
  • 为什么90%的顶尖团队开始转向Open-AutoGLM?与BrowserStack的4项对比揭秘
  • 还在用BrowserStack?Open-AutoGLM的这6个兼容性优势你必须知道
  • 解析 `useDeferredValue` 对渲染管线的阻塞:它是如何在“后台”默默生成低优先级 Fiber 树的?
  • Open-AutoGLM能替代LambdaTest吗?(深度剖析两者在真实场景中的表现差距)
  • Swift:优雅又强大的语法糖——Then库
  • Introducing Qwen-Image-Layered: A Free AI Photoshop Alternative for Image Layer Editing
  • LeetCode华为大模型岗刷题 - 指南
  • 揭秘Open-AutoGLM与Applitools核心差异:5大维度全面对比
  • 学术探索新利器:书匠策AI——本科硕士论文写作的智能导航仪
  • 学术探索新伙伴:解锁书匠策AI科研工具中的本科硕士论文写作“宝藏功能”
  • 剖析CVE-2024-58318:Kentico Xperience存储型XSS漏洞技术详解
  • 科研不必单打独斗:揭秘你的“隐形学术搭子”如何用AI重构论文写作
  • 为什么没人走后门干程序员?
  • 【2024最新实测数据】:Open-AutoGLM与WinAutomation响应速度差多少?
  • Open-AutoGLM与Selenium手机端兼容性全解析(90%团队忽略的关键差异)
  • 【开题答辩全过程】以 基于SpringBoot的企业资产管理系统的设计与实现为例,包含答辩的问题和答案
  • 2025年市场专业的高效粉碎机订做厂家选哪家,JGF-B系列高效粉碎机 /JGF-C系列高效粉碎机厂家口碑推荐 - 品牌推荐师
  • AI原生应用领域多租户系统的测试与部署要点
  • 【移动端自动化适配避坑指南】:Open-AutoGLM与Selenium的5大核心差异及应用场景分析
  • 【专家视角】Open-AutoGLM与Power Automate如何抉择?3年实战总结的7条铁律
  • 985本硕进不去大厂,是不是很丢人?
  • 从零开始学昇腾Ascend C算子开发-第三篇:算子开发基础
  • 详细介绍:Linux网络TCP(中)(12)
  • Open-AutoGLM报价自动化落地实践(90%企业忽略的关键细节)
  • 【急急急】上海进出口权办理流程需要哪些材料?多长时间?多少费用? - 速递信息
  • 【Java毕设全套源码+文档】基于springboot的电影播放平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • 从零开始学昇腾Ascend C算子开发-第四篇:常用算子实现
  • Open-AutoGLM自动保存性能优化指南(仅限高级用户访问)