逆序对+离散化

#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

全部评论

相关推荐

10-09 17:17
已编辑
门头沟学院 Java
活泼的代码渣渣在泡池...:同学你好,我也是学院本,后天要面这个亚信科技,是实习,请问问题都啥样呀,我项目就做了网上的,这是第一次面试
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
牛客37185681...:马德,我感觉这是我面过最恶心的公司,一面是两个女hr,说什么实习前几个月属于试用期,试用期过了才能转成正式实习生,我***笑了,问待遇就是不说,问能不能接受全栈,沙币公司
如果可以选,你最想去哪家...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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