제출 #1232879

#제출 시각아이디문제언어결과실행 시간메모리
1232879almaharbas4Election (BOI18_election)C++20
0 / 100
3 ms320 KiB
#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int sum;
    int suf;
    int pref;
    Node() : sum(0),suf(0),pref(0){}
};
vector<Node> seg;
vector<int> val;
Node merge(Node n,Node m)
{
    Node parent;
    parent.sum=n.sum+m.sum;
    parent.pref=min(n.pref,n.sum+m.pref);
    parent.suf=min(m.suf,m.sum+n.suf);
    return parent;
}
void update(int idx,int l,int r)
{
    if(l==r)
    {
        seg[idx].sum=val[l];
        seg[idx].suf=val[l];
        seg[idx].pref=val[l];
        return;
    }
    int mid=(l+r)/2;
    update(2*idx,l,mid); 
    update(2*idx+1,mid+1,r);
    seg[idx]=merge(seg[idx*2],seg[idx*2+1]);
}
Node upit(int idx,int start,int end,int l,int r)
{
    if(r<start||l>end) return Node();
    if(l<=start&&r>=end)
    {
        return seg[idx];
    }
    int mid=(start+end)/2;
    Node n=upit(idx*2,start,mid,l,r);
    Node m=upit(idx*2+1,mid+1,end,l,r);
    if(r<mid+1) return n;
    if(l>mid) return m;
    return merge(n,m);
}
int main()
{
    int len;
    cin>>len;
    seg.resize(4*len);
    val.resize(len);
    string s;
    cin>>s;
    for(int i=0;i<len;i++) val[i]=((s[i]=='T')?-1:1);
    update(1,0,len-1);
    int q;
    cin>>q;
    while(q--)
    {
        int l,r;
        cin>>l>>r;
        l--;r--;
        Node n=upit(1,0,len-1,l,r);
        int left=max(0,-n.pref);
        int right=max(0,-n.suf);
        cout<<max(left,right)<<'\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...