Submission #1243243

#TimeUsernameProblemLanguageResultExecution timeMemory
1243243denislavElection (BOI18_election)C++20
0 / 100
1 ms576 KiB
# include <iostream>
using namespace std;

const int INF=1e9;
const int MAX=5e5+11;

int n,q;
int a[MAX];
int pref[MAX];

struct node
{
    int sum;
    int pref,pref_pos;
    int suf,suf_pos;

    node friend operator + (node A, node B)
    {
        if(A.sum==INF) return B;
        if(B.sum==INF) return A;

        node res;
        res.sum=A.sum+B.sum;
        if(A.pref<=A.sum+B.pref)
        {
            res.pref=A.pref;
            res.pref_pos=A.pref_pos;
        }
        else
        {
            res.pref=A.sum+B.pref;
            res.pref_pos=B.pref_pos;
        }

        if(B.suf<=A.suf+B.sum)
        {
            res.suf=B.suf;
            res.suf_pos=B.suf_pos;
        }
        else
        {
            res.suf=A.suf+B.sum;
            res.suf_pos=A.suf_pos;
        }

        return res;
    }
};

node tree[MAX*4];

void build(int v=1, int l=1, int r=n)
{
    if(l==r)
    {
        tree[v]={a[l],a[l],l,a[l],l};
        return ;
    }

    int mid=(l+r)/2;
    build(v*2,l,mid);
    build(v*2+1,mid+1,r);
    tree[v]=tree[v*2]+tree[v*2+1];
}

node query(int le, int ri, int v=1, int l=1, int r=n)
{
    if(ri<l or r<le) return {INF,INF,INF,INF,INF};
    if(le<=l and r<=ri) return tree[v];

    int mid=(l+r)/2;
    return query(le,ri,v*2,l,mid)+query(le,ri,v*2+1,mid+1,r);
}

bool ban[MAX];
int greedy(int l, int r)
{
    int ans=0,balance=0;
    for(int i=l;i<=r;i++)
    {
        balance+=a[i];
        if(balance==-1)
        {
            ans++;
            ban[i]=1;
            balance++;
        }
    }

    balance=0;
    for(int i=r;i>=l;i--)
    {
        if(ban[i]) continue;
        balance+=a[i];
        if(balance==-1)
        {
            ans++;
            ban[i]=1;
            balance++;
        }
    }

    for(int i=l;i<=r;i++) ban[i]=0;
    return ans;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char z;
        cin>>z;
        pref[i]=pref[i-1];
        if(z=='C') a[i]=1;
        else
        {
            a[i]=-1;
            pref[i]++;
        }
    }

    build();

    cin>>q;
    while(q--)
    {
        int l,r;
        cin>>l>>r;

        int ans=0;
        node nd=query(l,r);
        ans=max(ans,-nd.pref);
        ans=max(ans,-nd.suf);
        cout<<ans<<"\n";
    }

    return 0;
}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...