首页 > 编程语言 > 详细

树状数组求逆序对

时间:2021-08-12 23:26:59      阅读:31      评论:0      收藏:0      [点我收藏+]

 

 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int sum,tree[300005],ll[300005],rank[300005],n;
struct Node{
    int num,val;
}a[300005];
int lowbit(int x){
    return (-x)&x;
}
int cmp(Node q,Node w){
    if(q.val==w.val) return q.num<w.num;
    return q.val<w.val;
}
int add(int ip,int k){
    for(int i=ip;i<=n;i+=lowbit(i)) tree[i]+=k;
    return 0;
}
int query(int ip){
    int ans=0;
    for(int i=ip;i>0;i-=lowbit(i)) ans+=tree[i];
    return ans;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i].val);
        a[i].num=i;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++) rank[a[i].num]=i;
    for(int i=1;i<=n;i++){
        add(rank[i],1);
        sum+=i-query(rank[i]);
        //ll[i]=i-query(rank[i]); ① 
    }
    cout<<sum;
    //for(int i=1;i<=n;i++) cout<<ll[i]<<" "; ② 
    return 0;
} 

如果加了①②就可以求前k个中第k位数是第几大了

树状数组求逆序对

原文:https://www.cnblogs.com/latent-Lin/p/15134357.html

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