Loading

洛谷 P1908 逆序对

https://www.luogu.org/problemnew/show/P1908

递归与分治

其实只需要在归并排序的时候加上一个计数的语句就好啦

#include<bits/stdc++.h>

using namespace std;

long long int n,a[500005],c[500005],sums;  //题目数据有点大 需要long long
 
void guibing(int s,int e)
{
    if(s==e)
    return;
    int mid=(s+e)/2,i=s,j=mid+1,k=s;
    guibing(i,mid),guibing(j,e);
    while(i<=mid&&j<=e)
    {
        if(a[i]<=a[j])
        c[k++]=a[i++];
        else
        {
            c[k++]=a[j++];
            sums+=mid-i+1;   //计数
        }
    }
    while(i<=mid)
    c[k++]=a[i++];
    while(j<=e)
    c[k++]=a[j++];
    for(i=s;i<=e;i++)
    a[i]=c[i];     //将排好序的复制回去
    return;
}


int main()
{
    int i;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    guibing(1,n);
    cout<<sums;
}

 

posted @ 2019-04-13 00:55  WinterFa1L  阅读(182)  评论(0编辑  收藏  举报