洛谷P1908逆序对(离散化+树状数组)

来源:互联网 发布:今日头条 招聘 java 编辑:程序博客网 时间:2024/05/16 09:17

题目来源:http://www.luogu.org/problem/show?pid=1908

搞来搞去,还是SYZOJ自带代码框最好用

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=40000+10;int n,c[maxn];struct data{    long long v;    int ii;}a[maxn];inline int lowbit(int x){return x&-x;}inline int cmp1(data a,data b){    return a.v<b.v;}inline int cmp2(data a,data b){    return a.ii<b.ii;}inline void add(int x,int d){    while(x<=n){        c[x]+=d;x+=lowbit(x);    }}inline int sum(int x){    int ret=0;    while(x>0){        ret+=c[x];x-=lowbit(x);    }    return ret;}int main(){    ios::sync_with_stdio(false);    cin>>n;    long long ans=0;    for(int i=1;i<=n;i++){        cin>>a[i].v;        a[i].ii=i;    }    sort(a+1,a+1+n,cmp1);    for(int i=1;i<=n;i++){        a[i].v=i;    }    sort(a+1,a+1+n,cmp2);    for(int i=n;i>=1;i--){        add(a[i].v,1);        ans+=sum(a[i].v-1);    }    cout<<ans;    return(0);}

1 0
原创粉丝点击