Submission #571102

#TimeUsernameProblemLanguageResultExecution timeMemory
571102elazarkorenMeetings (IOI18_meetings)C++17
0 / 100
20 ms1616 KiB
#include "meetings.h" #include <bits/stdc++.h> #define x first #define y second #define all(v) v.begin(), v.end() #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) using namespace std; typedef long long ll; typedef vector<ll> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; const ll infinity = 1e18; struct Seg { int n; vi seg; Seg (int m) { for (n = 1; n < m; n <<= 1); seg.resize(2 * n); } void update(int i, int x) { seg[i += n] = x; for (i >>= 1; i; i >>= 1) { seg[i] = max(seg[i << 1], seg[i << 1 | 1]); } } int query(int l, int r) { int ans = 0; for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l & 1) ans += seg[l++]; if (r & 1) ans += seg[--r]; } return ans; } }; vi minimum_costs(vector<int> h, vector<int> L, vector<int> R) { int q = L.size(), n = h.size(); vi ans(q); vector<int> left(n), right(n); left[0] = h[0] == 1 ? -1 : 0; for (int i = 1; i < n; i++) { left[i] = left[i - 1]; if (h[i] == 2) left[i] = i; } right[n - 1] = h[n - 1] == 1 ? n : n - 1; for (int i = n - 2; i >= 0; i--) { right[i] = right[i + 1]; if (h[i] == 2) right[i] = i; } Seg seg(n); for (int i = 0; i < n; i++) { if (h[i] == 1) { seg.update(i, right[i] - left[i] - 1); } } for (int j = 0; j < q; j++) { int l = L[j], r = R[j]; if (h[l] == 1 && right[l] > r) { ans[j] = r - l + 1; continue; } int max_len = 0; if (h[l] == 1) { chkmax(max_len, right[l] - l); l = right[l]; } if (h[r] == 1) { chkmax(max_len, r - left[r]); r = left[r]; } chkmax(max_len, seg.query(l, r)); ans[j] = 2 * (R[j] - L[j] + 1) - max_len; } 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...