제출 #1303933

#제출 시각아이디문제언어결과실행 시간메모리
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...