首页 > 其他分享 >2023/1/27 逆序对的数量

2023/1/27 逆序对的数量

时间:2023-01-27 22:33:17浏览次数:33  
标签:sort 27 int 元素 mid merge 2023 逆序

逆序对定义

对于数列的的第i个和第j个元素,如果满足i < j 且 a[i] > a[j],则其为一个逆序对。

分析
若将序列从中间划分,可以分为3类:

  1. 某逆序对的两个元素都在左边
  2. 某逆序对的两个元素都在右边
  3. 某逆序对的两个元素一个在左,一个在右
    算法框架
  4. 递归计算左边逆序对数量merge_sort(q, l, mid)
  5. 递归计算右边逆序对数量merge_sort(q, mid + 1, r)
  6. 计算第三种情况的逆序对数量
  7. 把他们加到一起
    结合归并思想
    如果左右两边的序列各自有序,第 3 中情况就容易计算的多
    比如序列是这样的

4 5 6 | 1 2 3
当你发现 4 比 3 大的时候,也就是说右边最大的元素都小于左边最小的元素,那么左边剩下的5和6都必然比右边的所有元素大,因此就可以不用数5和6的情形了,直接分别加上右半边的元素个数就可以了,这一步就降低到了
O(n), 我们知道递归式 T(n) = O(logn)*O(n) = O(nlogn)的,所以排序的成本是可以接受的,并且这一问题下,
可以很自然地使用归并排序。
代码

#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
int q[N], n;
LL merge_sort(int q[],int l,int r){
    if(l >= r) return 0;
    
    int mid = l + r >> 1;
    LL res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);
    
    int k = 0, i = l, j = mid + 1, tmp[r - l + 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(k = 0, i = l; i <= r; k++, i++) q[i] = tmp[k];
    return res;
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i++) cin >> q[i];
    cout << merge_sort(q, 0, n-1);
    return 0;
}

标签:sort,27,int,元素,mid,merge,2023,逆序
From: https://www.cnblogs.com/gaoweiextraordinary/p/17069457.html

相关文章

  • 230127_50_SpringBoot入门
    5.页面国际化:网页中文和英文相互转换修改默认编码为UTF-8loginlogin.tip=请登录login.password=密码login.remember记住我login.username=用户名login.btn=登......
  • 闲话 23.1.27
    闲话今天下午可是被这题干沉默了(就磕这题了apj三点给我的题我到现在才看懂我发现我好像脑子真不行也没啥想说的了这题挺ex的(杂题ARC139F给定\(n,m\),\(A_i\)......
  • 2023.1.27训练日志
    P1493分梨子很好的多维枚举的问题,用排序减少一维枚举的思路十分好,就是不知道这道题和它的标签“dp”有什么关系调了好久发现数组白开了一个,实在是难P3382【模板】三分......
  • WC2023(授课与讨论4)
    PO-Final2022三角形演讲(1)排序后,显然每一组是一个区间,设分别为\([1,x],(x,y]\)和\((y,n]\)枚举\(y\)并对前两段分类讨论,限制即\(\begin{cases}a_{x}\len-y\\a_{y}\le......
  • 【闲话】1.27 斐波那契数列一个性质及推广
    众所周知众所周知,斐波那契数列有一个性质:\[\gcd(f_{n},f_{m})=f_{\gcd(n,m)}\]在证明他之前,先来看个引理:\(\text{Lemma}\1\)\[f_{n+m}=f_{n}\timesf_{m-1}+f_{n+1......
  • 2023.1.27
    开了数论,开始学习高斯消元。上午学会了高斯消元和高斯约旦消元法,做了道板子,学习了高斯约旦消元法的判断无解和无穷解。很久没有使用过浮点数,犯了好几次与0比较的错误。......
  • C++算术计算器[2023-01-27]
    C++算术计算器[2023-01-27]面向对象程序设计C++作业考核一、考核内容使用C++语言,设计开发一个算术计算器,能够根据用户输入计算输出表达式结果。二、基本要求1.能够支......
  • 2023年第一天
    时间真快。转眼2023了。对2022简单做个回顾,对2023简单做个计划。2022年小结:1.学习了k8s、kubesphere等相关。同时对k8s相关概念以及其对容器编排有了初步的认识......
  • 1.27刷题记录
    目录1.[INSHack2017]sanity2.[SCTF2019]电单车3.[UTCTF2020]sstv4.key不在这里URL编码5.[GUET-CTF2019]soulsipse6.派大星的烦恼7.[UTCTF2020]spectogram1.[INSHack2017......
  • SQL271 牛客的课程订单分析(一)
    题目描述有一个订单信息表(order_info),请你写出一个sql语句查询在2025-10-15以后状态为购买成功的C++课程或者Java课程或者Python的订单,并且按照order_info的id升序排序......