답안 #783209

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
783209 2023-07-14T17:49:26 Z Ahmed57 Election (BOI18_election) C++17
0 / 100
3 ms 596 KB
#include<bits/stdc++.h>

using namespace std;
int seg[2000001],lazy[2000001];
void build(int p,int l,int r){
    if(l==r){
        seg[p] = 0;return ;
    }
    int md = (l+r)/2;
    build(p*2,l,md);build(p*2+1,md+1,r);
    seg[p] = 0;
}
void prop(int p,int l,int r){
    seg[p]+=lazy[p];
    if(l!=r){
        lazy[p*2]+=lazy[p];
        lazy[p*2+1]+=lazy[p];
    }
    lazy[p] = 0;
}
void update(int p,int l,int r,int lq,int rq,int val){
    prop(p,l,r);
    if(l>=lq&&r<=rq){
        lazy[p]+=val;
        prop(p,l,r);
        return ;
    }
    if(l>rq||r<lq)return ;
    int md = (l+r)/2;
    update(p*2,l,md,lq,rq,val);update(p*2+1,md+1,r,lq,rq,val);
    seg[p] = min(seg[p*2],seg[p*2+1]);
}
int query(int p,int l,int r,int lq,int rq){
    prop(p,l,r);
    if(l>=lq&&r<=rq)return seg[p];
    if(l>rq||r<lq)return 1e9;
    int md = (l+r)/2;
    return min(query(p*2,l,md,lq,rq),query(p*2+1,md+1,r,lq,rq));
}
//BIT Fenwick tree
int n ;
int bit[500001]={0};
void add(int e,int v){
    while(e<=n){
        bit[e]+=v;
        e+=e&-e;
    }
}
long long sum(int e){
    long long res = 0;
    while(e>=1){
        res+=bit[e];
        e -= e&-e;
    }
    return res;
}
//end BIT
int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    string s;cin>>n>>s;
    build(1,1,n);
    for(int i = 0;i<n;i++){
        if(s[i]=='T'){
            update(1,1,n,1,i+1,-1);
        }else update(1,1,n,1,i+1,1);
    }
    int q;cin>>q;
    int lol[q+1] = {0};
    vector<pair<pair<int,int>,int>> qu;
    for(int i = 1;i<=q;i++){
        int l,r;cin>>l>>r;
        l--;r--;
        qu.push_back({{l,r},i});
    }
    sort(qu.begin(),qu.end());reverse(qu.begin(),qu.end());
    int idx = n-1;
    stack<int> st;
    for(auto i:qu){
        while(idx>=i.first.first){
            if(s[idx]=='T'){
                st.push(idx);
                update(1,1,n,1,idx+1,1);
                add(idx+1,1);
            }else{
                if(st.size()){
                    update(1,1,n,1,st.top()+1,-1);
                    add(st.top()+1,-1);
                    st.pop();
                }
            }
            idx--;
        }
        int ans = query(1,1,n,i.first.first+1,i.first.second+1);
        if(i.first.second+1<n){
            ans-=query(1,1,n,i.first.second+2,i.first.second+2);
        }
        lol[i.second] = sum(i.first.second+1)-sum(i.first.first)+min(0,abs(ans));
    }
    for(int i = 1;i<=q;i++){
        cout<<lol[i]<<"\n";
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 596 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 596 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 596 KB Output isn't correct
2 Halted 0 ms 0 KB -