全部评论 1

  • 逆序对-树状数组版

    #include<bits/stdc++.h>
    using namespace std;
    const int N=5*1e5+100;
    int n;
    int Num[N],Tool[N],pre[N];
    int lowbit(int i){
        return i&-i;
    }
    void add(int i,int j){
        while(i<=n){
            pre[i]+=j;
            i+=lowbit(i);
        }
    }
    int ask(int i){
        int ans=0;
        while(i>0){
            ans+=pre[i];
            i-=lowbit(i);
        }
        return ans;
    }
    int main(){
        cin>>n;
        
        //离散化
        set <int> s;
        map <int,int> mp;
        for(int i=1;i<=n;++i){
            cin>>Num[i];
            s.insert(Num[i]);
        }
        int num=0;
        for(auto x:s){
            mp[x]=++num;
        }
        for(int i=1;i<=n;++i){
            Tool[i]=mp[Num[i]];
        }
        //离散化结束
    
        long long ans=0;
        for(int i=n;i>=1;--i){
            add(Tool[i],1);
            ans+=ask(Tool[i]-1);
        }
    
        cout<<ans;
        return 0;
    }
    

    12小时前 来自 浙江

    0
首页