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

    AcWing 788.逆序对的数量

    题目描述

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

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

    输入格式

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

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

    数据范围

    1≤n≤100000

    输入样例

    6
    2 3 4 5 6 1
    

    输出样例

    5
    

    题目思路

    采用归并排序算法,思路与归并排序是一样的

    #include<iostream>
    using namespace std;
    const int N = 1e5+10;
    int q[N],tmp[N];
    
    long long int merge_sort(int q[],int l,int r)
    {
        if(l>=r) return 0;
        int mid = l+r>>1;
        long long int res = merge_sort(q,l,mid)+merge_sort(q,mid+1,r);
        int k=0,i=l,j=mid+1;
        while(i<=mid&&j<=r)
            if(q[i]<=q[j])tmp[k++] = q[i++];
            else tmp[k++] = q[j++],res+=mid-i+1;//如果左半边的元素大于右边该数,左边元素后面的每个数也大于它,一共有mid-i+1个。
        while(i<=mid)tmp[k++] = q[i++];
        while(j<=r)tmp[k++] = q[j++];
        for(i=l,j=0;i<=r;i++,j++)q[i] = tmp[j];
        return res;
    }
    
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)scanf("%d",&q[i]);
        printf("%ld",merge_sort(q,0,n-1));
        return 0;
    }
    
    
  • 相关阅读:
    [手游新项目历程]-36- error: stray ‘357’ in program
    广告学(一)
    VMware的Unity模式
    poj3709
    poj1849
    bzoj2007
    bzoj3209
    bzoj2466,poj1222
    bzoj1016
    bzoj2186
  • 原文地址:https://www.cnblogs.com/fsh001/p/12177696.html
Copyright © 2011-2022 走看看