제출 #1350258

#제출 시각아이디문제언어결과실행 시간메모리
1350258a.pendovElection (BOI18_election)C++20
100 / 100
289 ms31728 KiB
#include<bits/stdc++.h>
using namespace std;
const long long MAXN=500009;
long long mas[MAXN];

inline long long min1(long long a,long long b)
{
    if(a>b)return b;
    return a;
}

struct Node
{
    int l,r;
    int minPref,minSuf,sum;
    int ans;
};

Node tree[4*MAXN];

void mergeNodes(Node& ans,Node a, Node b)
{
    ans.l=a.l;
    ans.r=b.r;
    ans.sum=a.sum+b.sum;
    ans.minPref=min1(a.minPref,a.sum+b.minPref);
    ans.minSuf=min1(b.minSuf,b.sum+a.minSuf);

    ans.ans=min1(min1(a.ans+b.sum,a.sum+b.ans),a.minPref+b.minSuf);
}

void build(int n,int l,int r)
{
    if(l==r)
    {
        tree[n].l=l;
        tree[n].r=r;
        tree[n].sum=mas[l];
        tree[n].minPref=min1(0,mas[l]);
        tree[n].minPref=min1(0,mas[l]);
        tree[n].ans=min1(0,mas[l]);

        return;
    }

    build(2*n,l,(l+r)/2);
    build(2*n+1,(l+r)/2+1,r);

    mergeNodes(tree[n],tree[2*n],tree[2*n+1]);
}

Node getAns(int n,int l,int r)
{
    if(tree[n].l==l&&tree[n].r==r)
    {
        return tree[n];
    }

    if(tree[2*n].r<l)
    {
        return getAns(2*n+1,l,r);
    }

    if(tree[2*n+1].l>r)
    {
        return getAns(2*n,l,r);
    }

    Node ans;

    mergeNodes(ans,getAns(2*n,l,tree[2*n].r),getAns(2*n+1,tree[2*n+1].l,r));

    return ans;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int N,Q,l,r;
    char ch;

    cin>>N;

    for(int i=1;i<=N;i++)
    {
        cin>>ch;
        if(ch=='C')mas[i]=1;
        else mas[i]=-1;
    }

    build(1,1,N);

    cin>>Q;

    while(Q--)

    {
        cin>>l>>r;
        cout<<-getAns(1,l,r).ans<<'\n';
    }

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