Submission #1232393

#TimeUsernameProblemLanguageResultExecution timeMemory
1232393VMaksimoski008Meetings (IOI18_meetings)C++20
17 / 100
73 ms14920 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; using ll = long long; struct segment_tree { int n; vector<int> tree; segment_tree(int _n) : n(_n), tree(4*n) {} void update(int u, int tl, int tr, int p, int v) { if(tl == tr) { tree[u] = max(tree[u], v); } else { int tm = (tl + tr) / 2; if(p <= tm) update(2*u, tl, tm, p, v); else update(2*u+1, tm+1, tr, p, v); tree[u] = max( tree[2*u], tree[2*u+1] ); } } int query(int u, int tl, int tr, int l, int r) { if(tl > r || l > tr) return 0; if(l <= tl && tr <= r) return tree[u]; int tm = (tl + tr) / 2; return max( query(2*u, tl, tm, l, r), query(2*u+1, tm+1, tr, l, r) ); } void update(int p, int v) { update(1, 0, n-1, p, v); } int query(int l, int r) { return query(1, 0, n-1, l, r); } }; vector<ll> minimum_costs(vector<int> a, vector<int> L, vector<int> R) { int q = L.size(), n = a.size(); vector<ll> ans(q, 1e18); vector<int> pref(n, -1), suf(n, n+1); int lst = -1; set<pair<int, int> > B; for(int i=0; i<n; i++) { if(a[i] == 1) { B.insert({ i, lst+1 }); pref[lst+1] = max(pref[lst+1], i); suf[i] = min(suf[i], lst+1); } else if(a[i] == 2) { lst = i; } } for(int i=1; i<n; i++) pref[i] = max(pref[i-1], pref[i]); for(int i=n-2; i>=0; i--) suf[i] = min(suf[i+1], suf[i]); for(int i=0; i<q; i++) { if(L[i] > 0 && pref[L[i]-1] >= L[i]) { int len = min(R[i], pref[L[i]-1]) - L[i] + 1; ans[i] = min(ans[i], 2ll * (R[i] - L[i] + 1) - len); } if(R[i] < n - 1 && suf[R[i]+1] <= R[i]) { int len = R[i] - max(L[i], suf[R[i]+1]) + 1; ans[i] = min(ans[i], 2ll * (R[i] - L[i] + 1) - len); } } segment_tree sgt(n); vector<pair<int, int> > qus[n]; for(int i=0; i<q; i++) qus[R[i]].push_back({ L[i], i }); for(int i=0; i<n; i++) { while(!B.empty() && B.begin()->first == i) { sgt.update(B.begin()->second, i - B.begin()->second + 1); B.erase( B.begin() ); } for(auto [l, id] : qus[i]) ans[id] = min(ans[id], 2ll * (i - l + 1) - sgt.query(l, 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...