zoukankan      html  css  js  c++  java
  • 788. 逆序对的数量

    题目描述

    给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。

    逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

    输入格式

    第一行包含整数n,表示数列的长度。

    第二行包含 n 个整数,表示整个数列。

    输出格式

    输出一个整数,表示逆序对的个数。

    数据范围

    1≤n≤100000

    输入样例:

    6
    2 3 4 5 6 1

    输出样例:

    5

    思路

      归并排序

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 using namespace std;
     5 typedef long long ll;
     6 const int max_n=1e5+5;
     7 
     8 int a[max_n], b[max_n];
     9 ll res=0;
    10 
    11 void mergeSort(int l, int r) {
    12     if(l>=r) return;
    13     int mid=l+r >> 1;
    14     mergeSort(l, mid);
    15     mergeSort(mid+1, r);
    16     int p1=l, p2=mid+1, cnt=l;
    17     while(p1<=mid && p2<=r) {
    18         if(a[p1]<=a[p2]) b[cnt++]=a[p1++];
    19         else {
    20             res+=mid-p1+1;
    21             b[cnt++]=a[p2++];
    22         }
    23     }
    24     while(p1<=mid) b[cnt++]=a[p1++];
    25     while(p2<=r) b[cnt++]=a[p2++];
    26     for(int i=l; i<=r; i++) a[i]=b[i];
    27 }
    28 
    29 int main() {
    30     int n;
    31     cin>>n;
    32     for(int i=0; i<n; i++) cin>>a[i];
    33     mergeSort(0, n-1);
    34     cout<<res<<endl;
    35     return 0;
    36 }
  • 相关阅读:
    部分网络加载预训练模型代码实现
    数据不平衡处理方法
    面试题目汇总
    多线程和多进程
    数据结构知识点总结
    GBDT和XGBoost的区别
    GBDT和随机森林的区别
    机器学习-特征处理
    一篇写得很好的关于lct的博客
    Count and Say 2014/10/23
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/13695337.html
Copyright © 2011-2022 走看看