Submission #707015

#TimeUsernameProblemLanguageResultExecution timeMemory
707015someoneConstellation 3 (JOI20_constellation3)C++14
100 / 100
267 ms83252 KiB
#include <bits/stdc++.h> #define int long long #define a second #define b first using namespace std; struct Star { int x, y, c, val; bool operator <(const Star& other) const{ if(y == other.y) return x < other.x; return y < other.y; } }; struct Ans { set<Star> sup; int add = 0, minInf = 0; void upd(int h) { while(!sup.empty()) { auto it = sup.begin(); if((*it).y > h) return; minInf = min(minInf, add + (*it).val); sup.erase(it); } } void merge(Ans other, int h) { other.upd(h); if((int)sup.size() < (int)other.sup.size()) { swap(add, other.add); swap(sup, other.sup); swap(minInf, other.minInf); } add += other.minInf; other.add += minInf; minInf += other.minInf; for(Star s : other.sup) { s.val += other.add - add; sup.insert(s); } } void print() { cout << add << ' ' << minInf << '\n'; for(Star s : sup) cout << s.x << ' ' << s.y << ' ' << s.val << '\n'; cout << '\n'; } }; const int N = 2e5 + 42, INF = 1e18 + 42; vector<Star> stars[N]; int n, m, h[N], l[N], r[N]; Ans solve(int i) { if(i == -1) { Ans ans; return ans; } Ans ans; for(Star s : stars[i]) { ans.add += s.c; ans.sup.insert(s); } ans.minInf = ans.add; ans.merge(solve(l[i]), h[i]); ans.merge(solve(r[i]), h[i]); return ans; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 0; i < n; i++) cin >> h[i]; cin >> m; for(int i = 0; i < m; i++) { int x, y, c; cin >> x >> y >> c; x--; stars[x].push_back({x, y, c, -c}); } int maxi = 0; deque<int> imax; for(int i = 0; i < n; i++) { l[i] = -1; while(!imax.empty() && h[imax[0]] < h[i]) { l[i] = imax[0]; imax.pop_front(); } if(h[i] > h[maxi]) maxi = i; imax.push_front(i); } imax.clear(); for(int i = n-1; i > -1; i--) { r[i] = -1; while(!imax.empty() && h[imax[0]] <= h[i]) { r[i] = imax[0]; imax.pop_front(); } imax.push_front(i); } Ans ans = solve(maxi); ans.upd(INF); cout << ans.minInf; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...