Submission #1303933

#TimeUsernameProblemLanguageResultExecution timeMemory
1303933nathlol2Mountains (NOI20_mountains)C++20
0 / 100
436 ms327680 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 333333;
int n, a[N], lf[N], rf[N];
struct segtree{
    struct node{
        int v;
        node *l, *r;
        node(int v):v(v), l(0), r(0){}
    };
    typedef node* pnode;
    pnode rt = 0;
    void upd(pnode &k, int l, int r, int pos){
        if(!k) k = new node(0);
        if(l == r) return k->v += 1, void();
        int md = (l + r) / 2;
        if(pos <= md) upd(k->l, l, md, pos);
        else upd(k->r, md + 1, r, pos);
        k->v = (k->l ? k->l->v : 0) + (k->r ? k->r->v : 0);
    }
    int qry(pnode k, int l, int r, int ql, int qr){
        if(!k || r < ql || qr < l) return 0;
        if(ql <= l && r <= qr) return k->v;
        int md = (l + r) / 2;
        return qry(k->l, l, md, ql, qr) + qry(k->r, md + 1, r, ql, qr);
    }
}s, s1;

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for(int i = 1;i<=n;i++){
        cin >> a[i];
        lf[i] = s.qry(s.rt, 0, (int)1e18, 0, a[i] - 1);
        s.upd(s.rt, 0, (int)1e18, a[i]);
    }
    for(int i = n;i>=1;i--){
        rf[i] = s1.qry(s1.rt, 0, (int)1e18, 0, a[i] - 1);
        s1.upd(s1.rt, 0, (int)1e18, a[i]);
    }
    int ans = 0;
    for(int i = 2;i<n;i++){
        ans += (lf[i] * rf[i]);
    }
    cout << ans;
}
#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...