逆序对+离散化

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a[maxn],c[maxn];
struct dd {
    int x,id;
    dd(int xx=0,int yy=0):x(xx),id(yy) {
    }
    bool operator <(const dd&aa)const {
        return x<aa.x;
    }
};
dd b[maxn];
int lowbit(int x) {
    return x&(-x);
}
int n;
int add(int x,int y) {
    for(int i=x; i<=1e6+10; i+=lowbit(i)) {
        c[i]+=y;
    }
}
long long ask(int x) {
    long long ans=0;
    for(int i=x; i>0; i-=lowbit(i))
        ans+=c[i];
    return ans;
}
int main() {
//    freopen("2.in","r",stdin);
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>b[i].x;
        b[i].id=i;
        //cin>>a[i];
    }
    sort(b+1,b+1+n);
    int now=0,nub=0;
    for(int i=1; i<=n; i++) {
        if(b[i].x!=nub) {
            now++;
            a[b[i].id]=now;
            nub=b[i].x;
        } else {
            a[b[i].id]=now;
            nub=b[i].x;
        }
    }
    long long ans=0;
    for(int i=n; i>=1; i--) {
        add(a[i],1);
        ans+=ask(a[i]-1);

    }
    printf("%lld\n",ans);
    //十年oi一场空,不开longlong见祖宗 
    return 0;
}

记得输出也要用long long

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务