Submission #1138106

#TimeUsernameProblemLanguageResultExecution timeMemory
1138106vuavisaoElection (BOI18_election)C++20
0 / 100
8 ms12352 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3", "unroll-loops") using namespace std; using ll = long long; const int N = 500'000 + 10; struct LazySegTree { struct Node { int val = 0; int lazy = 0; Node() {}; Node(int _val, int _lazy): val(_val), lazy(_lazy) {}; Node operator+(const Node& other) const { Node res; res.val = max(this->val, other.val); return res; } }; int n_node = 0; vector<Node> tree = {}; void resize(int _n) { n_node = _n; tree.resize((n_node << 2) + 10); }; LazySegTree() {}; LazySegTree(int _n) { this->resize(_n); }; void down(int node, int l, int 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(int node, int l, int r, int L, int R, int 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; } int 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(int l, int r, int val) { return update(1, 1, n_node, l, r, val); } Node query(int node, int l, int r, int L, int R) { down(node, l, r); if (l > r || L > R || l > R || L > r) return Node(-1'000'000'000, 0); if (L <= l && r <= R) return tree[node]; int mid = (l + r) >> 1; return query(node << 1, l, mid, L, R) + query(node << 1 | 1, mid + 1, r, L, R); } Node Query(int l, int r) { return query(1, 1, n_node, l, r); } }; struct FenWick { int n_node = 0; vector<int> tree = {}; void resize(int n) { n_node = n; tree.resize(n + 10, 0); } FenWick() {}; FenWick(int n) { this -> resize(n); }; void Update(int idx, int val) { for( ; idx <= n_node; idx += (idx & - idx)) tree[idx] += val; return; } int Query(int idx) { int res = 0; for( ; idx > 0; idx -= (idx & - idx)) res += tree[idx]; return res; } int Sum_to(int l, int r) { if(l > r) return 0; return Query(r) - Query(l - 1); } int kth(int val) { int res = 0, s = 0; for(int mask = 30; mask >= 0; -- mask) { int nxt = res | (1 << mask); if(nxt < n_node && s + tree[nxt] < val) { res = nxt; s += tree[nxt]; } } ++ res; return res; } void reset(int idx) { for ( ; idx <= n_node; idx += (idx & - idx)) tree[idx] = 0; return; } }; int n, q; string s; int pred[N]; vector<pair<int, int>> events[N]; int lft[N]; int res[N]; void solve() { cin >> n >> s; s = ' ' + s; for (int i = 1; i <= n; ++i) { pred[i] = pred[i - 1] + (s[i] == 'C' ? 1 : -1); } stack<int> stk; for (int 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 (int i = 1; i <= n; ++i) { st.Update(i, i, pred[i]); } cin >> q; for (int i = 1; i <= n; ++i) { if (lft[i] != 0) { events[lft[i]].push_back(make_pair(i, -1)); } } for (int i = 1; i <= q; ++i) { int l, r; cin >> l >> r; events[l].push_back(make_pair(r, i)); } FenWick bit(n); for (int l = n; l >= 1; --l) { if (s[l] == 'T') { stk.push(l); st.Update(l, n, 1); bit.Update(l, 1); if (lft[l] > 0) { bit.Update(lft[l], -1); } } for (const auto& [r, idx] : events[l]) { if (idx == -1) { st.Update(r, n, -1); } else { int 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(0, max_pref - st.Query(r, r).val); } } } for (int 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); // int t; cin >> t; int 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...