Submission #1266867

#TimeUsernameProblemLanguageResultExecution timeMemory
1266867bbldrizzyElection (BOI18_election)C++20
100 / 100
300 ms20280 KiB
#include <bits/stdc++.h> #include <ios> #include <iostream> #include <random> using namespace std; using ll = long long; using P = pair<int, int>; #define f first #define s second const int MOD = 1e9+7; const ll inf = 4*1e18; const int mx = 5*1e5+5; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; struct Node { int l, r, s, a; Node operator+(Node b) { Node ret; ret.l = max(l, s+b.l); ret.r = max(r+b.s, b.r); ret.s = s + b.s; ret.a = max({a+b.s, s+b.a, l+b.r}); return ret; } }; Node segtree[2000001]; char s[500001]; int n; void build(int v, int l, int r) { if (l == r) { if (s[l-1] == 'T') { segtree[v] = {1, 1, 1, 1}; } else { segtree[v] = {0, 0, -1, 0}; } return; } int mid = (l+r)/2; build(2*v, l, mid); build(2*v+1, mid+1, r); segtree[v] = segtree[2*v] + segtree[2*v+1]; } Node query(int v, int l, int r, int ql, int qr) { if (qr < l || ql > r) {return {0, 0, 0, 0};} if (ql >= l && qr <= r) return segtree[v]; int mid = (ql+qr)/2; Node x = query(2*v, l, r, ql, mid)+query(2*v+1, l, r, mid+1, qr); return x; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n; for (int i = 0; i < n; i++) { cin >> s[i]; } build(1, 1, n); int q; cin >> q; while (q--) { int a, b; cin >> a >> b; cout << query(1, a, b, 1, n).a << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...