제출 #1340694

#제출 시각아이디문제언어결과실행 시간메모리
1340694soimi0804Election (BOI18_election)C++20
0 / 100
3 ms344 KiB
    #include <bits/stdc++.h>

    using namespace std;

    const int MAXN = 5e5+5;
    int n,q,v1[MAXN],v2[MAXN];

    struct segm{

        vector<int> tree;

        void init(int n,int v[]){
            tree.assign(4*n,-1e9);
            build(1,1,n,v);
        }

        void build(int node,int l,int r,int v[]){
            if(l == r){
                tree[node] = v[l];
                return;
            }
            int mid = (l+r)/2;
            build(2*node,l,mid,v);
            build(2*node+1,mid+1,r,v);
            tree[node] = max(tree[2*node],tree[2*node+1]);
        }

        int query(int node,int l,int r,int ql,int qr){

            if(r<ql || qr < l)return -1e9;
            if(ql <= l && r<= qr){
                return tree[node];
            }
            int mid = (l+r)/2;
            return max(query(2*node,l,mid,ql,qr),query(2*node+1,mid+1,r,ql,qr));
        }
    };

    int main()
    {

        cin >> n;
        string s;
        cin >> s;
        for(int i = 1;i<=n;i++){
            v1[i] = v1[i-1]+((s[i-1]=='C')?-1:1);
        }
        for(int i = n;i>=1;i--){
            v2[i] = v2[i+1]+((s[i-1]=='C')?-1:1);
        }

        segm ps,ss;
        ps.init(n,v1);
        ss.init(n,v2);

        cin >> q;
        while(q--){
            int l,r;
            cin >> l >> r;
            
            int ans1 = max(0, v1[l-1] - ps.query(1,1,n,l,r));
            int ans2 = max(0, v2[r+1] - ss.query(1,1,n,l,r));

            cout << max(ans1, ans2) << '\n';
        }

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