首页 > 其他 > 详细

逆序对

时间:2019-08-05 00:16:05      阅读:92      评论:0      收藏:0      [点我收藏+]

P1908 逆序对

做法早就忘了,今回忆一波

#include<bits/stdc++.h>
using namespace std;
long long n,a[500005],b[500005],ans;
void merge(int l,int r)//分解整个数组
{
    if(l==r)return;//分解得只有1个元素就收手
    int mid=(l+r)/2;
    merge(l,mid);
    merge(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r)//只要没越界
        if(a[i]<=a[j])b[k++]=a[i++];//不符合条件
        else //符合条件
            {
                b[k++]=a[j++];
                ans+=mid-i+1;//???
            }
    while(i<=mid) b[k++]=a[i++];
    while(j<=r) b[k++]=a[j++];//处理剩余
    for(int i=l; i<=r; i++)
        a[i]=b[i];//重新赋值
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
        scanf("%lld",&a[i]);
    merge(1,n);
    printf("%lld",ans);
    return 0;
}

逆序对

原文:https://www.cnblogs.com/yige2019/p/11300567.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!