Submission #97378

#TimeUsernameProblemLanguageResultExecution timeMemory
97378georgerapeanuElection (BOI18_election)C++11
100 / 100
1187 ms52012 KiB
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

const int NMAX = 5e5;
const int QMAX = 5e5;

struct node_t{
    int sum;
    int suf_sum;
   
    node_t(int sum = 0,int suf_sum = 0){
        this->sum = sum;
        this->suf_sum = suf_sum;
    }

    node_t join(node_t &other){
        return node_t(sum + other.sum,min(other.suf_sum,suf_sum + other.sum));
    }
};

struct query_t{
    int r,ind;
};

node_t aint[4 * NMAX + 5];

void update(int nod,int st,int dr,int pos,int val){
    if(dr < pos || st > pos){
        return ;
    }
    
    if(st == dr){
        aint[nod].sum += val;
        aint[nod].suf_sum += val;
        return;
    }

    int mid = (st + dr) / 2;

    update(nod * 2,st,mid,pos,val);
    update(nod * 2 + 1,mid + 1,dr,pos,val);

    aint[nod] = aint[2 * nod].join(aint[2 * nod + 1]);
}

node_t query(int nod,int st,int dr,int S,int D){
    if(st > D || dr < S){
        return {0,0};
    }
    
    if(S <= st && dr <= D){
        return aint[nod];
    }

    int mid = (st + dr) / 2;

    node_t a = query(nod * 2,st,mid,S,D);
    node_t b = query(nod * 2 + 1,mid + 1,dr,S,D);

    return a.join(b);
}

int n,q;
int ans[QMAX + 5];
char c[NMAX + 5];
vector<query_t> queries[NMAX + 5];

int non_active[NMAX + 5],len;

int main(){
    
    scanf("%d\n",&n);
    fgets(c + 1,NMAX + 5,stdin);
    scanf("%d\n",&q);
    
    for(int i = 1;i <= q;i++){
        int l,r;
        scanf("%d %d\n",&l,&r);
        queries[l].push_back({r,i});
    }

    for(int i = n;i;i--){
        if(c[i] == 'T'){
            non_active[++len] = i;
        }
        else{
            update(1,1,n,i,1);
            if(len){
                update(1,1,n,non_active[len],-1);
                len--;
            }
        }
        for(auto it:queries[i]){
            int tmp = max(0,-query(1,1,n,i,it.r).suf_sum);
            int st = 0,dr = len + 1;
            while(dr - st > 1){
                int mid = (st + dr) / 2;
                if(non_active[mid] <= it.r){
                    dr = mid;
                }
                else{
                    st = mid;
                }
            }
            tmp += len - st;
            ans[it.ind] = tmp;
        }
    }

    for(int i = 1;i <= q;i++){
        printf("%d\n",ans[i]);
    }

    return 0;
}

Compilation message (stderr)

election.cpp: In function 'int main()':
election.cpp:75:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d\n",&n);
     ~~~~~^~~~~~~~~~~
election.cpp:76:10: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     fgets(c + 1,NMAX + 5,stdin);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
election.cpp:77:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d\n",&q);
     ~~~~~^~~~~~~~~~~
election.cpp:81:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d\n",&l,&r);
         ~~~~~^~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:936:0,
                 from /usr/include/c++/7/cstdio:42,
                 from election.cpp:1:
In function 'char* fgets(char*, int, FILE*)',
    inlined from 'int main()' at election.cpp:76:10:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:261:58: warning: call to '__fgets_chk_warn' declared with attribute warning: fgets called with bigger size than length of destination buffer
  return __fgets_chk_warn (__s, __bos (__s), __n, __stream);
                                                          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...