ACM算法训练【逆序对的数量】

简介: ACM算法训练【逆序对的数量】


题目说明


9f2d07973c5240c29b1327b276c39fd7.png


数据范围


e50c2252e97a4d1a8833c06b2ea16656.png


样例


d4aaf96819c64631987353be69807bd9.png


代码


①归并排序基本思想:


02bc5178209145a1982ef871fe027287.png


②在归并的过程中,逆序对出现的三种情况:


304777cf69674ee98d11ca7ca24d9511.png


a.全部出现在左边的区间

b.全部出现的右边的区间

c.出现在左右两个区间


d8ed5cffd6f846adbfad96b63ca1d4a0.png


黄色情况的求解方法:


294f0ec54ca2456a99340a066e66ec23.png


找左边区间比右边区间每一个数大的个数,相加就是答案

在归并排序求出两个有序区间后,可以发现如下性质:


ebe4351a61824386b1c1c57411414b26.png


当qi在某一阶段大于qj,易得qi及后所有数都大于qj,也就是构成两边区间的逆序对


#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int arr[N],temp[N];
long long msort(int l,int r)
{
    if(l>=r) return 0;  //递归边界
    int mid=(l+r)/2;   
    long long res=msort(l,mid)+msort(mid+1,r);   //划分区间
    int i=l,j=mid+1,k=0;
    while(i<=mid&&j<=r)  //归并过程
    {
        if(arr[i]<=arr[j]) temp[k++]=arr[i++];
        else
        {
            temp[k++]=arr[j++];
            res+=mid-i+1;
        }
    }
    while(i<=mid) temp[k++]=arr[i++];   //扫尾
    while(j<=r) temp[k++]=arr[j++];
    for(int i=l,j=0;i<=r;i++,j++)   //物归原主
        arr[i]=temp[j];
    return res;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++) scanf("%d",&arr[i]);
    long long res=msort(0,n-1);
    cout<<res;
    return 0;
}
目录
相关文章
|
3天前
|
算法 测试技术 C++
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
|
3天前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
36 0
|
3天前
|
存储 JavaScript 算法
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
30 0
|
3天前
|
算法 测试技术 C#
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
|
3天前
|
算法 程序员
【算法训练-链表 五】【链表求和】:链表相加(逆序)、链表相加II(顺序)
【算法训练-链表 五】【链表求和】:链表相加(逆序)、链表相加II(顺序)
59 0
|
10月前
|
算法
【算法】用递归的方法逆序输出或倒置一个栈
【算法】用递归的方法逆序输出或倒置一个栈
96 0
【算法】用递归的方法逆序输出或倒置一个栈
|
人工智能 算法 Java
算法_逆序对_归并(java)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
|
算法
算法 | 妙用递归(顺序&逆序)打印一个数的每一位
- 程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用 - 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问-题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 - 递归的能力在于用有限的语句来定义对象的无限集合 - 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回
184 0
算法 | 妙用递归(顺序&逆序)打印一个数的每一位
|
算法
算法基础~链表~从位置m到n逆序
算法基础~链表~从位置m到n逆序
81 0
算法基础~链表~从位置m到n逆序