Submission #1191305

#TimeUsernameProblemLanguageResultExecution timeMemory
1191305MatteoArcariMeetings (IOI18_meetings)C++20
17 / 100
58 ms9032 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll Inf = 1e18; struct Segtree { vector<ll> ma; int n; Segtree (int _n) : n(_n), ma(4 * _n) {} void update (int i, int sl, int sr, int pos, ll x) { if (sr - sl == 1) { ma[i] = x; return; } int mid = sl + sr >> 1; if (pos < mid) update(2 * i, sl, mid, pos, x); else update(2 * i + 1, mid, sr, pos, x); ma[i] = max(ma[2 * i], ma[2 * i + 1]); } void update (int i, ll x) { update(1, 0, n, i, x); } ll get (int i, int sl, int sr, int l, int r) { if (sl >= r || sr <= l) return 0; if (sl >= l && sr <= r) return ma[i]; int mid = sl + sr >> 1; return max(get(2 * i, sl, mid, l, r), get(2 * i + 1, mid, sr, l, r)); } ll get (int l, int r) { return get(1, 0, n, l, r); } }; vector<ll> minimum_costs(vector<int> h, vector<int> l, vector<int> r) { int q = l.size(); int n = h.size(); vector<ll> ans(q, Inf); Segtree st(n); vector<ll> ps(n), left(n, -1), right(n, n); for (int i = 0; i < n; i++) { if (i) { ps[i] = ps[i - 1]; left[i] = left[i - 1]; } if (h[i] == 1) { ps[i]++; } else { left[i] = i; ps[i] = 0; } st.update(i, ps[i]); } for (int i = n - 1; i >= 0; i--) { if (i < n - 1) right[i] = right[i + 1]; if (h[i] == 2) { right[i] = i; } } for (int i = 0; i < q; i++) { ll len = r[i] - l[i] + 1; ll ma = 0; if (h[l[i]] == 1) { ma = max(ma, right[l[i]] - l[i]); } if (h[r[i]] == 1) { ma = max(ma, r[i] - left[r[i]]); } ma = min(ma, len); r[i] = left[r[i]]; l[i] = right[l[i]]; if (l[i] <= r[i]) { ma = max(ma, st.get(l[i], r[i] + 1)); } ans[i] = 2 * len - ma; } 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...