Submission #371009

#TimeUsernameProblemLanguageResultExecution timeMemory
371009wind_reaperPilot (NOI19_pilot)C++17
100 / 100
707 ms52364 KiB
#include <bits/stdc++.h> using namespace std; struct dsu{ vector<int64_t> e; vector<bool> active; int64_t ans; dsu(int n){ e.resize(n, -1); ans = 0; active.resize(n, 0); } int64_t get(int64_t x){ return (e[x] < 0 ? x : e[x] = get(e[x])); } int64_t f(int x){ int64_t t = -e[get(x)]; return (t*(t+1)) / 2; } bool unite(int x, int y){ x = get(x), y = get(y); if(!active[x]){ ans += f(x); active[x] = 1; } if(!active[y] || x == y) return 0; if(e[x] > e[y]) swap(x, y); ans -= f(x) + f(y); e[x] += e[y]; e[y] = x; ans += f(x); return 1; } }; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin >> n >> q; vector<array<int, 2>> h(n), query(q); for(int i = 0; i < n; i++){ cin >> h[i][0]; h[i][1] = i; } for(int i = 0; i < q; i++){ cin >> query[i][0]; query[i][1] = i; } sort(h.begin(), h.end()); sort(query.begin(), query.end()); vector<int64_t> ans(q); dsu d(n); int cur = 0; for(int i = 0; i < q; i++){ while(cur < n && query[i][0] >= h[cur][0]){ int idx = h[cur][1]; int nxt = idx + 1; int pre = idx - 1; if(nxt < n) d.unite(idx, nxt); if(pre >= 0) d.unite(idx, pre); cur++; } ans[query[i][1]] = d.ans; } for(int i = 0; i < q; i++) cout << ans[i] << ' '; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...