Submission #1322559

#TimeUsernameProblemLanguageResultExecution timeMemory
1322559ray1457Mountains (NOI20_mountains)C++20
100 / 100
488 ms33304 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define int ll
#define vi vector<int>
#define pii pair<int, int>
#define ff first
#define ss seecond
#define all(x) x.begin(),x.end()
#define pb push_back

const int INF = 1e18;

class BIT {
    public:
    int n;
    vi t;

    BIT(const int N) : n(N), t(N+1, 0) {};

    void update(int p, int v) {
        while (p <= n) {
            t[p] += v;
            p += (p & -p); 
        }
    }

    int sum(int r) {
        int ans = 0;
        while (r > 0) {
            ans += t[r];
            r -= r&-r;
        }
        return ans;
    }

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

void solve() {
    int n;
    cin >> n;
    vi a(n);
    for (auto &i : a) cin >> i;

    vi v = a;
    sort(all(v));
    v.erase(unique(all(v)), v.end());
    map<int, int> idx;
    for (int i = 0; i<v.size(); i++) {
        idx[v[i]] = i+1;
    }

    for (int i = 0; i<n; i++) {
        a[i] = idx[a[i]];
    }
    BIT lt(n), rt(n);
    vi l(n, 0), r(n, 0);
    for (int i = 0; i<n; i++) {
        if (a[i] > 1) {
            l[i] = lt.query(1, a[i]-1);
        }
        lt.update(a[i], 1);
    }
    for (int i = n-1; i>=0; i--) {
        if (a[i] > 1) {
            r[i] = rt.query(1, a[i]-1);
        }
        rt.update(a[i], 1);
    }
    int ans = 0;
    for (int i = 0; i<n; i++) {
        ans += l[i]*r[i];
    }
    cout << ans;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...