Submission #570248

#TimeUsernameProblemLanguageResultExecution timeMemory
570248elpro123Mountains (NOI20_mountains)C++14
100 / 100
670 ms40268 KiB
#include<bits/stdc++.h> using namespace std; struct nodo{ int s, e, m, cnt; nodo *l, *r; nodo(int s1, int e1){ s=s1, e=e1, m=(s1+e1)/2, cnt=0; if(s == e) return; l = new nodo(s, m); r = new nodo(m+1, e); } void update(int x, int v){ cnt += v; if(s == e) return; if(x <= m) l->update(x, v); else r->update(x, v); } int query(int x, int y){ if(x <= s && y >= e) return cnt; int ret = 0; if(x <= m) ret += l->query(x, y); if(y >= m+1) ret += r->query(x, y); return ret; } void clear(){ cnt = 0; if(s == e) return; l->clear(); r->clear(); } }; int main(){ long n; cin>>n; long long H[n+1]; for(int i=1; i<=n; i++){ cin>>H[i]; } long long izquierda[n+1], derecha[n+1]; pair<long long, int> arreglo[n+1]; int cnt = 1; long long total = 0; for(int i=1; i<=n; i++){ arreglo[i] = {H[i], i}; } sort(arreglo + 1, arreglo + n + 1); for(int i=1; i<=n; i++){ if(i>1 and arreglo[i].first != arreglo[i-1].first){ cnt++; } H[arreglo[i].second] = cnt; } nodo *algo = new nodo(0, n); for(int i=1; i<=n; i++){ izquierda[i] = algo->query(0, H[i] - 1); algo->update(H[i], 1); } algo->clear(); for(int i=n; i>0; i--){ derecha[i] = algo->query(0, H[i] - 1); algo->update(H[i], 1); } for(int i=1; i<=n; i++){ total += izquierda[i] * derecha[i]; } cout<<total; 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...