제출 #1108868

#제출 시각아이디문제언어결과실행 시간메모리
11088680pt1mus23Election (BOI18_election)C++14
100 / 100
454 ms44512 KiB
// fast.cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define ins insert      
#define pb push_back
#define endl '\n'
#define putr(x) cout<<x<<endl;return; 
#define all(x) x.begin(),x.end()
int nxt(){ int x;cin>>x; return x; }

const int mod = 1e9 +7, sze = 5e5 +10, inf = LLONG_MAX, LG = 20;
string s;
int n;
struct st{
    int sum=0;
    int pf=0;
    int sf=0;
    int res=0;
} T[sze*4];

st combine(st a,st b){
    st c;
    c.sum = a.sum + b.sum;
    c.pf = max(a.pf, a.sum + b.pf);
    c.sf = max(b.sf, b.sum + a.sf);
    c.res=max( { a.pf  + b.sf , a.res + b.sum, a.sum + b.res });
    return c;
}
void build(int node,int l,int r){
    if(l==r){
        if(s[l]=='C'){
            T[node]={-1,0,0,0};
        }
        else{
            T[node]={1,1,1,1};
        }
        return ;
    }
    int mid = (l+r)/2;
    build(2*node,l,mid);
    build(2*node +1,mid+1,r);
    T[node]=combine(T[node*2],T[node*2 +1]);
}
st qry(int l,int r,int node=1,int lx=0,int rx=n-1){
    if(l>rx || r<lx){
        return {0,0,0,0};
    }
    if(lx>=l && rx<=r){
        return T[node];
    }
    int mid = (lx+rx)/2;
    return combine(qry(l,r,2*node ,lx,mid), qry(l,r,2*node +1,mid+1,rx));

}
void rush(){
    cin>>n;
    cin>>s;
    build(1,0,n-1);
    int q;
    cin>>q;
    while(q--){
        int l=nxt()-1,r=nxt()-1;
        cout<<qry(l,r,1,0,n-1).res<<endl;
    }
}
 
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int tt = 1; 
    // cin>>tt;
 
    while(tt--){
        rush();
    }
 
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...