d064. P-5-4. 反序數量 (APCS201806) - TCFSH CIRC Judge

本文最後更新於:2024年1月12日 下午

d064. P-5-4. 反序數量 (APCS201806) - TCFSH CIRC Judge

AP325-d064-4.cpp

// Author : ysh
// 08/17/2022 Wed 21:46:43.85
#include<bits/stdc++.h>
using namespace std;
#define int long long

struct tree {
    vector<int> bit;  // binary indexed tree
    int n;

    tree(int n) {
        this->n = n;
        bit.assign(n, 0);
    }

    tree(vector<int> a) : tree(a.size()) {
        for (size_t i = 0; i < a.size(); i++)
            add(i, a[i]);
    }

    int sum(int r) {
        int ret = 0;
        for (; r >= 0; r = (r & (r + 1)) - 1)
            ret += bit[r];
        return ret;
    }

    int sum(int l, int r) {
        return sum(r) - sum(l - 1);
    }

    void add(int idx, int delta) {
        for (; idx < n; idx = idx | (idx + 1))
            bit[idx] += delta;
    }
};

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    vector<int>f,g;
    int n;cin>>n;
    priority_queue<pair<int,int>>q;
    for(int i = 0;i<n;i++) {
        int tmp;cin>>tmp;
        f.push_back(tmp);
        g.push_back(tmp);
        q.push({tmp,i});
    }
    int ans = 0;
    sort(g.begin(),g.end());
    g.resize(unique(g.begin(),g.end()) - g.begin());
    tree t = tree(g.size());
    for(int i = n - 1;i >= 0;i--) {
        auto now = f[i];
        int r = lower_bound(g.begin(),g.end(),now) - g.begin();
        if(0 <= r - 1) ans = ans + t.sum(0,r - 1);
        t.add(r,1);
    }
    cout<<ans;
    return 0;
}

d064. P-5-4. 反序數量 (APCS201806) - TCFSH CIRC Judge
http://mysh212.github.io/algosolution/AP325-d064-4.cpp/
作者
ysh
發布於
2022年8月17日
更新於
2024年1月12日
許可協議