제출 #1138853

#제출 시각아이디문제언어결과실행 시간메모리
1138853dadas08Election (BOI18_election)C++20
100 / 100
1062 ms82180 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3", "unroll-loops") using namespace std; using ll = long long; const ll N = 500'000 + 10; struct LazySegTree { struct Node { ll val = -1'000'000'000; ll lazy = 0; Node() {}; Node(ll _val, ll _lazy): val(_val), lazy(_lazy) {}; Node operator+(const Node& other) const { Node res; res.val = max(this->val, other.val); return res; } }; ll n_node = 0; vector<Node> tree = {}; void resize(ll _n) { n_node = _n; tree.resize((n_node << 2) + 10); }; LazySegTree() {}; LazySegTree(ll _n) { this->resize(_n); }; void down(ll node, ll l, ll r) { tree[node].val += tree[node].lazy; if (l < r) { tree[node << 1].lazy += tree[node].lazy; tree[node << 1 | 1].lazy += tree[node].lazy; } tree[node].lazy = 0; } void update(ll node, ll l, ll r, ll L, ll R, ll val) { down(node, l, r); if (l > r || L > R || l > R || L > r) return; if (L <= l && r <= R) { tree[node].lazy += val; down(node, l, r); return; } ll mid = (l + r) >> 1; update(node << 1, l, mid, L, R, val); update(node << 1 | 1, mid + 1, r, L, R, val); tree[node] = tree[node << 1] + tree[node << 1 | 1]; } void Update(ll l, ll r, ll val) { return update(1, 1, n_node, l, r, val); } Node query(ll node, ll l, ll r, ll L, ll R) { down(node, l, r); if (l > r || L > R || l > R || L > r) return Node(); if (L <= l && r <= R) return tree[node]; ll mid = (l + r) >> 1; return query(node << 1, l, mid, L, R) + query(node << 1 | 1, mid + 1, r, L, R); } Node Query(ll l, ll r) { return query(1, 1, n_node, l, r); } }; struct FenWick { ll n_node = 0; vector<ll> tree = {}; void resize(ll n) { n_node = n; tree.resize(n + 10, 0); } FenWick() {}; FenWick(ll n) { this -> resize(n); }; void Update(ll idx, ll val) { for( ; idx <= n_node; idx += (idx & - idx)) tree[idx] += val; return; } ll Query(ll idx) { ll res = 0; for( ; idx > 0; idx -= (idx & - idx)) res += tree[idx]; return res; } ll Sum_to(ll l, ll r) { if(l > r) return 0; return Query(r) - Query(l - 1); } ll kth(ll val) { ll res = 0, s = 0; for(ll mask = 30; mask >= 0; -- mask) { ll nxt = res | (1 << mask); if(nxt < n_node && s + tree[nxt] < val) { res = nxt; s += tree[nxt]; } } ++ res; return res; } void reset(ll idx) { for ( ; idx <= n_node; idx += (idx & - idx)) tree[idx] = 0; return; } }; ll n, q; string s; ll pred[N]; vector<pair<ll, ll>> events[N]; ll lft[N]; ll res[N]; void solve() { cin >> n >> s; s = ' ' + s; for (ll i = 1; i <= n; ++i) { pred[i] = pred[i - 1] + (s[i] == 'C' ? 1 : -1); } stack<ll> stk; for (ll i = n; i >= 1; --i) { if (s[i] == 'T') { stk.push(i); } else { if (!stk.empty()) { lft[stk.top()] = i; stk.pop(); } } } while (!stk.empty()) { stk.pop(); } LazySegTree st(n); for (ll i = 1; i <= n; ++i) { st.Update(i, i, 1'000'000'000); st.Update(i, i, pred[i]); } cin >> q; for (ll i = 1; i <= n; ++i) { if (lft[i] != 0) { events[lft[i]].push_back(make_pair(i, -1)); } } for (ll i = 1; i <= q; ++i) { ll l, r; cin >> l >> r; events[l].push_back(make_pair(r, i)); } FenWick bit(n); for (ll l = n; l >= 1; --l) { if (s[l] == 'T') { st.Update(l, n, 1); bit.Update(l, 1); } for (const auto& [r, idx] : events[l]) { if (idx == -1) { st.Update(r, n, -1); bit.Update(r, -1); } else { ll max_pref = max(pred[l - 1], st.Query(l, r - 1).val); // cerr << idx << ' ' << max_pref << ' ' << st.Query(r, r).val << '\n'; res[idx] = bit.Sum_to(l, r) + max(0ll, max_pref - st.Query(r, r).val); } } } for (ll i = 1; i <= q; ++i) { cout << res[i] << '\n'; } } int32_t main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); // ll t; cin >> t; ll t = 1; while (t-- > 0) { solve(); // cout << '\n'; } return (0 ^ 0); } /// Code by vuavisao
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...