首页 > 其他 > 详细

逆序对

时间:2020-02-09 12:08:48      阅读:67      评论:0      收藏:0      [点我收藏+]

逆序对

所求的交换次数等价于满足\(i<j,a_i>a_j\)\((i,j)\)的数对的个数(这种数对的个数叫做逆序数)。

可以利用树状数组来求解逆序对的问题

// Created by CAD on 2020/2/8.
#include <bits/stdc++.h>
#define lowbit(i) (i&-i)
using namespace std;

const int maxn=1e5+5;
int a[maxn],c[maxn],n;
void add(int x,int k){
    while(x<=n)
        c[x]+=k,x+=lowbit(x);
}
int getsum(int x){
    int ans=0;
    while(x>=1)
        ans+=c[x],x-=lowbit(x);
    return ans;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;++i)
        cin>>a[i];
    int ans=0;
    for(int i=1;i<=n;++i){
        ans+=i-1-getsum(a[i]);
        add(a[i],1);
    }
    cout<<ans<<endl;
}

逆序对

原文:https://www.cnblogs.com/CADCADCAD/p/12286557.html

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