Submission #1265816

#TimeUsernameProblemLanguageResultExecution timeMemory
12658163m17Election (BOI18_election)C++20
100 / 100
984 ms36616 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int Nmax = 5e5 + 26;
const int LogN = 18;

struct SegTree
{
    int Sum;
    int Pre;
    int Suf;
    int Ans;
};

int n , q;
string s;
SegTree ST[Nmax * 4];


SegTree Merge (SegTree a , SegTree b)
{
    SegTree ANS;
    ANS.Sum = a.Sum + b.Sum;
    ANS.Pre = max(a.Sum + b.Pre , a.Pre);
    ANS.Suf = max(a.Suf + b.Sum , b.Suf);
    ANS.Ans = max({a.Ans + b.Sum , a.Sum + b.Ans , a.Pre + b.Suf});

    return ANS;
}

void Build(int id , int l , int r)
{
    if(l == r)
    {
        if(s[l] == 'T') ST[id] = {1 , 1 , 1 , 1};
        else ST[id] = {-1 , 0 , 0 , 0};
        return;
    }

    int mid = (l + r) / 2;

    Build(id * 2 , l , mid);
    Build(id * 2 + 1 , mid + 1 , r);

    ST[id] = Merge(ST[id * 2] , ST[id * 2 + 1]);
}

SegTree Get (int id , int l , int r , int u , int v)
{
    if(r < u || l > v) return {0 , 0 , 0 , 0};

    if(u <= l && r <= v) return ST[id];

    int mid = (l + r) / 2;

    return Merge(Get(id * 2 , l , mid , u , v), Get(id * 2 + 1 , mid + 1 , r , u , v));
}

main()
{
    cin >> n >> s;
    s = ' ' + s;

    Build(1 , 1 , n);
    //cout << ST[1].Ans << ' ' << ST[1].Sum << ' ' << ST[1].Pre << ' ' << ST[1].Suf << '\n';
    cin >> q;
    for (int i = 1 ; i <= q ; i++)
    {
        int l , r;
        cin >> l >> r;
        int Ans = max(0LL , Get(1 , 1 , n , l , r).Ans);
        cout << Ans << '\n';
    }
}

/*
TC
TTTCCTTT
CCCTTTTTTCC

-1 -2 -3 -2 -1 0 1 2 3 2 1

11
CCCTTTTTTCC
3
1 11
4 9
1 6
*/

Compilation message (stderr)

election.cpp:60:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   60 | main()
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...