逆序对/归并排序

逆序对定义:对于给定的一段正整数序列,逆序对就是序列中 a_i>a_ji<j 的有序对。

P1908 逆序对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

复制代码
#include<bits/stdc++.h> #define int long long using namespace std; const int N=2e6+10; int n,m,a[N],c[N],res,num; void msort(int l,int r) //归并排序开始 { if(l==r) return; //递归终止 int mid=l+r>>1,i=l,j=mid+1,num=l; msort(l,mid),msort(mid+1,r); //确保两边均有序 while(i<=mid&&j<=r){ if(a[j]>=a[i]) c[num++]=a[i++]; else c[num++]=a[j++],res+=mid-i+1; //由于左半部分一定是有序的,所以从i到mid的数都比a[j]大,均为逆序 } while(i<=mid) c[num++]=a[i++]; while(j<=r) c[num++]=a[j++]; for(int i=l;i<=r;i++) a[i]=c[i]; } signed main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; msort(1,n); //归并排序 cout<<res; }
复制代码

P1774 最接近神的人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

由于题目要求每次只能交换相邻的 2 个数,最终形成一个不降的序列,所以我们只能把所有逆序的数全部对换即可完成,也就是求出序列的逆序对

复制代码
#include<bits/stdc++.h> #define int long long using namespace std; const int N=2e6+10; int n,m,a[N],c[N],res,num; void msort(int l,int r) //归并排序开始 { if(l==r) return; //递归终止 int mid=l+r>>1,i=l,j=mid+1,num=l; msort(l,mid),msort(mid+1,r); //确保两边均有序 while(i<=mid&&j<=r){ if(a[j]>=a[i]) c[num++]=a[i++]; else c[num++]=a[j++],res+=mid-i+1; //由于左半部分一定是有序的,所以从i到mid的数都比a[j]大,均为逆序 } while(i<=mid) c[num++]=a[i++]; while(j<=r) c[num++]=a[j++]; for(int i=l;i<=r;i++) a[i]=c[i]; } signed main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; msort(1,n); //归并排序 cout<<res; }
复制代码

 


__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17984937.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
-- --
点击右上角即可分享
微信分享提示