Submission #1220430

#TimeUsernameProblemLanguageResultExecution timeMemory
1220430toast12Mountains (NOI20_mountains)C++20
100 / 100
284 ms23920 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define lc 2*v
#define rc 2*v+1
#define tm (tl+tr)/2

struct segtree {
    vector<int> tree;
    segtree(int sz) {
        tree.resize(4*sz);
    }
    void update(int v, int tl, int tr, int pos, int val) {
        if (tr < pos || tl > pos) return;
        if (tl == tr) {
            tree[v] += val;
            return;
        }
        update(lc, tl, tm, pos, val);
        update(rc, tm+1, tr, pos, val);
        tree[v] = tree[lc]+tree[rc];
    }
    int query(int v, int tl, int tr, int r) {
        if (tl > r) return 0;
        if (tr <= r) return tree[v];
        return query(lc, tl, tm, r)+query(rc, tm+1, tr, r);
    }
};  

int main() {
    int n;
    cin >> n;
    vector<pair<ll, int>> h(n);
    for (int i = 0; i < n; i++) {
        cin >> h[i].first;
        h[i].second = i;
    }
    sort(h.begin(), h.end());
    int cur = 1;
    vector<ll> new_h(n);
    for (int i = 0; i < n; i++) {
        if (i == 0 || h[i-1].first != h[i].first) {
            new_h[h[i].second] = cur;
            cur++;
        }
        else new_h[h[i].second] = new_h[h[i-1].second];
    }
    vector<ll> a = new_h;
    segtree stree(n+1);
    vector<ll> l(n);
    for (int i = 0; i < n; i++) {
        l[i] = stree.query(1, 1, n, a[i]-1);
        stree.update(1, 1, n, a[i], 1);
    }
    reverse(a.begin(), a.end());
    segtree stree2(n+1);
    vector<ll> r(n);
    for (int i = 0; i < n; i++) {
        r[i] = stree2.query(1, 1, n, a[i]-1);
        stree2.update(1, 1, n, a[i], 1);
    }
    reverse(r.begin(), r.end());
    ll ans = 0;
    for (int i = 0; i < n; i++) {
        ans += l[i]*r[i];
    }
    cout << ans << '\n';
    return 0;
}
#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...