제출 #1343573

#제출 시각아이디문제언어결과실행 시간메모리
1343573biankElection (BOI18_election)C++20
100 / 100
227 ms20340 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
 
using vi = vector<int>;
using ii = pair<int, int>;
using vii = vector<ii>;
using ll = long long;
using ld = long double;
using vll = vector<ll>;
using vb = vector<bool>;
using pll = pair<ll, ll>;

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

#define pb push_back
#define eb emplace_back

#define fst first
#define snd second

struct Node {
    int maxPref, maxSuff;
    int sum, ret;
    Node() {
        maxPref = maxSuff = sum = ret = 0;
    }
    Node(int x) {
        maxPref = maxSuff = ret = max(x, 0);
        sum = x;
    }
};

Node merge(Node a, Node b) {
    Node c;
    c.sum = a.sum + b.sum;
    c.maxPref = max(a.maxPref, a.sum + b.maxPref);
    c.maxSuff = max(a.maxSuff + b.sum, b.maxSuff);
    c.ret = max({a.ret + b.sum, a.sum + b.ret, a.maxPref + b.maxSuff});
    return c;
}

const int SZ = 1 << 19;

Node st[2 * SZ];

int main() {
    ios::sync_with_stdio(0);         
    cin.tie(0); cout.tie(0);
    
    int n, q;
    string s;
    cin >> n >> s >> q;
    
    forn(i, n) st[i + SZ] = s[i] == 'T' ? +1 : -1;
    dforsn(i, 1, SZ) st[i] = merge(st[2 * i], st[2 * i + 1]);
    
    forn(_, q) {
        int l, r;
        cin >> l >> r;
        --l;
        Node leftRet, rightRet;
        for (l += SZ, r += SZ; l < r; l /= 2, r /= 2) {
            if (l & 1) leftRet = merge(leftRet, st[l++]);
            if (r & 1) rightRet = merge(st[--r], rightRet);
        }
        cout << merge(leftRet, rightRet).ret << "\n";
    }
    
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...