제출 #1290321

#제출 시각아이디문제언어결과실행 시간메모리
1290321LIAElection (BOI18_election)C++17
100 / 100
204 ms56552 KiB
//
// Created by liasa on 12/11/2025.
//

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>

struct Node {
  ll l, r, sum, mx_pre, mx_suf, ans;
};

struct Seg {
  vector<Node> seg;
  ll sz = 1;
  const ll inf = 1e18;
  Seg(ll n, vll &arr) {
    for (; sz < n; sz *= 2)
      ;
    seg.resize(2 * sz);
    for (ll i = 0; i < n; ++i) {
      seg[sz + i] = {
          i, i, arr[i], max(0LL, arr[i]), max(0LL, arr[i]), max(0LL, arr[i])};
    }

    for (ll i = sz - 1; i >= 1; --i) {
      seg[i] = merge(seg[i * 2], seg[i * 2 + 1]);
    }
  }

  Node merge(Node &a, Node &b) {
    Node ret = {-1, -1, -1, -1, -1, -1};
    ret.l = a.l;
    ret.r = b.r;
    ret.sum = a.sum + b.sum;
    ret.mx_pre = max(a.mx_pre, a.sum + b.mx_pre);
    ret.mx_suf = max(b.mx_suf, b.sum + a.mx_suf);
    ret.ans = max({a.ans + b.sum, a.sum + b.ans, a.mx_pre + b.mx_suf});
    return ret;
  }
  ll query(ll l, ll r) {
    Node L = {0, 0, 0, 0, 0, -inf}, R = {0, 0, 0, 0, 0, -inf};
    l += sz;
    r += sz;
    while (l <= r) {
      if (l & 1)
        L = merge(L, seg[l++]);
      if (!(r & 1))
        R = merge(seg[r--], R);
      l >>= 1;
      r >>= 1;
    }
    return merge(L, R).ans;
  }
};

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  ll n, q;
  cin >> n;
  vll arr(n);
  for (ll i = 0; i < n; ++i) {
    char c;
    cin >> c;
    if (c == 'C') {
      arr[i] = -1;
    } else
      arr[i] = 1;
  }

  Seg seg(n, arr);
  cin >> q;
  while (q--) {
    ll l, r;
    cin >> l >> r;
    l--;
    r--;
    cout << seg.query(l, r) << "\n";
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...