• 洛谷P1908《逆序对》


    原创建时间:2018-09-15 21:32:12

    Based on 归并排序

    题目地址

    题目描述

    猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。

    Input / Output 格式

    输入格式

    第一行,一个数n,表示序列中有n个数。

    第二行n个数,表示给定的序列。序列中每个数字不超过(10^9)

    输出格式

    给定序列中逆序对的数目。

    输入样例

    6
    5 4 2 6 3 1
    

    输出样例

    11
    

    数据范围

    对于25%的数据,(n leq 2500n)

    对于50%的数据,(n leq 4 imes 10^4)

    对于所有数据,(n leq 5 imes 10^5)

    请使用较快的输入输出

    解题思路

    暴力做法

    (O(n))枚举所有的点,(O(n))比较数的大小,求出逆序对的个数

    均摊(O(n^2))

    正解

    分治

    想想归并排序的过程


    比如我们要对下面的区间进行归并排序

    [a_i mid=4 a_j ]

    [2 4 7 8 1 5 6 24 ]

    我们拿1去比较,此时可以构成的逆序对个数为4,把他放到(r_k)里,那么此时(i)是指向(a_1)

    接着继续比较,直到(a_i < a_j),就将(a_i)放到(r_k)

    以此类推,最终的逆序对个数就是中间求出的个数的和(=mid-i+1)的和

    代码实现

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int MAXN = 5 * 1e5 + 10;
    
    int n, a[MAXN], tmp[MAXN];
    
    long long int ans;
    
    void mergeSort(int l, int r) {
        if (l == r) return;
        int mid = (l + r) >> 1;
        mergeSort(l, mid);
        mergeSort(mid+1, r);
        int i = l, j = mid + 1, k = l;
        while (i <= mid && j <= r) {
            if (a[i] <= a[j]) tmp[k] = a[i++], ++k;
            else tmp[k] = a[j++], ++k, ans += (long long int) mid - i + 1;
        }
        while (i <= mid) tmp[k++] = a[i++];
        while (j <= r) tmp[k++] = a[j++];
        for (int i = l; i <= r; ++i) a[i] = tmp[i];
    }
    
    int main(int argc, char *const argv[]) {
        cin >> n;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
        }
        mergeSort(1, n);
        cout << ans << endl;
        return 0;
    }
    
    
  • 相关阅读:
    Linux基础(一)
    计算机基础之网络基础
    计算机基础之操作系统
    计算机基础之计算机硬件基础
    .NET Reflector 8.2支持VS2013高亮显示和代码地图视图
    jQuery图表开源软件
    8个实用的页面布局和用户界面jQuery插件
    关于mvc3.0RadioButtonFor的使用
    链式调用-python
    给实数用千分位方法输出结果
  • 原文地址:https://www.cnblogs.com/handwer/p/11745390.html
Copyright © 2020-2023  润新知