Submission #1342955

#TimeUsernameProblemLanguageResultExecution timeMemory
1342955killerzaluuElection (BOI18_election)C++20
28 / 100
3094 ms6964 KiB
#include <bits/stdc++.h>
using namespace std;
 
struct node {
  long long sum, pref, suff;
};
 
long long a[200100], n;
node seg[800100];
 
node merge(node A, node B) {
  node C;
  C.sum=A.sum+B.sum;
  C.pref=max(A.pref, A.sum+B.pref);
  C.suff=max(B.suff, B.sum+A.suff);
  return C;
}
 
void build(long long v, long long l, long long r) {
  if(l==r) {
    seg[v]={a[l], max(0LL, a[l]), max(0LL, a[l])};
    return;
  }
  long long mid=(l+r)/2;
  build(2*v, l, mid);
  build(2*v+1, mid+1, r);
  seg[v]=merge(seg[2*v], seg[2*v+1]);
}

node query(long long v, long long l, long long r, long long a, long long b) {
  if(l==a && r==b) {
    return seg[v];
  }
  long long mid=(l+r)/2;
  if(b<=mid) return query(2*v, l, mid, a, b);
  if(mid<a) return query(2*v+1, mid+1, r, a, b);
  return merge(query(2*v, l, mid, a, mid), query(2*v+1, mid+1, r, mid+1, b));
}
 
int main() {
  long long q,i; cin>>n;
  
  char c[n+1];
  for(i=1; i<=n; i++) cin>>c[i];
  
  for(i=1; i<=n; i++) {
    if(c[i]=='C') {
      a[i]=-1;
    }
    else a[i]=1;
  }
  cin>>q;
  
  build(1, 1, n);
  while(q--) {
    long long l, r; cin>>l>>r;
    
      node C=query(1, 1, n, l, r);
      
      long long ans=max(C.pref, C.suff);

      for(i=l; i<=r-1; i++) {
        ans=max(query(1, 1, n, l, i).pref+query(1, 1, n, i+1, r).suff, ans);
      }

      cout<<ans<<endl;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...