Submission #1289299

#TimeUsernameProblemLanguageResultExecution timeMemory
1289299itaykarnyElection (BOI18_election)C++20
0 / 100
2 ms568 KiB
#include<iostream> #include<vector> #include<set> #include<algorithm> #include<map> #include<queue> #include<stack> using namespace std; using ll = long long; using vll = vector<ll>; using vvll = vector<vll>; using pll = pair<ll, ll>; using vpll = vector<pll>; vll arr; struct Node { ll l, r; Node* lp, * rp; ll sum_intreval = 0, min_suf = 0; Node(ll L, ll R) { l = L, r = R; if (l + 1 == r) { sum_intreval = arr[l]; min_suf = arr[l]; return; } lp = new Node(l, (l + r) / 2); rp = new Node((l + r) / 2, r); pull(); } void pull() { sum_intreval = lp->sum_intreval + rp->sum_intreval; min_suf = min(rp->min_suf, rp->sum_intreval + lp->min_suf); } void update(ll start, ll x) { if (start < l || start >= r) { return; } if (start == l && start + 1 == r) { sum_intreval = x; min_suf = x; return; } lp->update(start, x); rp->update(start, x); pull(); } ll solve(ll start, ll end, ll& sum_to_now) { if (start >= r || end <= l) { return 1e18; } if (start <= l && r <= end) { sum_to_now += sum_intreval; return sum_to_now + min_suf - sum_intreval; } ll ans = 1e18; ans = min(ans, rp->solve(start, end, sum_to_now)); ans = min(ans, lp->solve(start, end, sum_to_now)); return ans; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(0); ll n; cin >> n; string s; cin >> s; arr.resize(n); for (ll i = 0; i < n; i++) { if (s[i] == 'C') { arr[i] = 1; } else { arr[i] = -1; } } ll q; cin >> q; vector<vpll> quries(n); for (ll i = 0; i < q; i++) { ll l, r; cin >> l >> r; l--, r--; quries[l].push_back({ r, i }); } Node* root = new Node(0, n); vll index; vll ans(q); for (ll i = n - 1; i >= 0; i--) { if (arr[i] == 1) { if (!index.empty()) { root->update(index.back(), -1); index.pop_back(); } } else { index.push_back(arr[i]); root->update(i, 0); } ll sum_to_now = 0; for (auto j : quries[i]) { sum_to_now = 0; ans[j.second] += root->solve(i, j.first + 1, sum_to_now); ans[j.second] += index.end() - lower_bound(index.begin(), index.end(), j.first, greater<ll>()); } } for (ll i = 0; i < q; i++) { cout << ans[i] << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...