# 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |