逆序对+离散化

#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

全部评论

相关推荐

07-02 13:52
武汉大学 golang
骗你的不露头也秒
牛客87776816...:😃查看图片
点赞 评论 收藏
分享
点赞 评论 收藏
分享
Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 13:54
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务