제출 #248412

#제출 시각아이디문제언어결과실행 시간메모리
248412kostia244Meetings (IOI18_meetings)C++17
0 / 100
527 ms3088 KiB
#include "meetings.h" #pragma GCC optimize("trapv") #include<bits/stdc++.h> using namespace std; using ll = long long; const int maxn = 1<<17; int n, q, h[maxn], l[maxn], r[maxn]; vector<ll> ans; array<int, 3> tree[2*maxn]; array<int, 3> merge(array<int, 3> a, array<int, 3> b) { if(a[0] ^ b[0]) return a[0] > b[0] ? a : b; return {a[0], min(a[1], b[1]), max(a[2], b[2])}; } void upd(int p, int v) { p += n; for(tree[p] = {v, p-n, p-n}; p>>=1;) tree[p] = merge(tree[p<<1], tree[p<<1|1]); } array<int, 3> get(int l, int r) { //cout << l << " " << r << '\n'; array<int, 3> res = {-1, 0, 0}; //for(l += n, r += n+1; l < r; l>>=1, r>>=1) { // if(l&1) res = merge(res, tree[l++]); // if(r&1) res = merge(res, tree[--r]); //} //cout << res[0] << " " << res[1] << " " << res[2] << '\n'; l += n; r += n+1; while(l < r) res = merge(res, tree[l++]); return res; } map<pair<int, int>, ll> memo; ll solve(int l, int r) { if(r < l) return 0; if(memo.count({l, r})) return memo[{l, r}]; auto [V, tl, tr] = get(l, r); ll ans = min(V*1ll*(r-tl+1) + solve(l, tl-1), V*1ll*(tr-l+1) + solve(tr+1, r)); //cout << l << " " << r << " " << V << " " << tl << " " << tr << " / " << ans << '\n'; return memo[{l, r}] = ans; } std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) { q = L.size(); n = H.size(); for(int i = 0; i < n; i++) { h[i] = H[i]; l[i] = L[i]; r[i] = R[i]; } ans.resize(q); for(int i = 0; i < n; i++) upd(i, h[i]); for(int i = 0; i < q; i++) ans[i] = solve(l[i], r[i]); return 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...