Submission #1314502

#TimeUsernameProblemLanguageResultExecution timeMemory
1314502boclobanchatElection (BOI18_election)C++20
100 / 100
590 ms44628 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
pair<int,int> seg[MAXN*4];
int nex[MAXN],pref[MAXN],f[MAXN*2],ans[MAXN];
vector< pair<int,int> > vq[MAXN];
stack<int> st;
pair<int,int> merge(pair<int,int> a,pair<int,int> b)
{
	return {a.first+b.first,min(b.second,b.first+a.second)};
}
void update(int l,int r,int i,int val,int pos)
{
	if(i<l||r<i) return ;
	if(l==r)
	{
		seg[pos]={seg[pos].first+val,min(0,seg[pos].first+val)};
		return ;
	}
	int mid=(l+r)/2;
	update(l,mid,i,val,pos*2);
	update(mid+1,r,i,val,pos*2+1);
	seg[pos]=merge(seg[pos*2],seg[pos*2+1]);
}
pair<int,int> get(int l,int r,int u,int v,int pos)
{
	if(u<=l&&r<=v) return seg[pos];
	int mid=(l+r)/2;
	if(v<=mid) return get(l,mid,u,v,pos*2);
	if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
	return merge(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,q;
	string s;
	cin>>n>>s>>q;
	s=' '+s;
	for(int i=0;i<=n*2;i++) f[i]=n+1;
	for(int i=1;i<=n;i++) pref[i]=pref[i-1]+(s[i]=='C')-(s[i]=='T');
	for(int i=n-1;i+1;i--) f[pref[i+1]+n]=i+1,nex[i]=f[pref[i]+n-1];
	for(int i=1;i<=q;i++)
	{
		int l,r;
		cin>>l>>r;
		vq[l].push_back({r,i});
	}
	for(int i=n;i;i--)
	{
		update(1,n,i,(s[i]=='C')-(s[i]=='T'),1);
		while(!st.empty()&&nex[i-1]>=st.top()) update(1,n,st.top(),-1,1),st.pop();
		if(nex[i-1]<=n)
		{
			st.push(nex[i-1]);
			update(1,n,nex[i-1],1,1);
		}
		for(auto v:vq[i]) ans[v.second]=get(1,n,i,v.first,1).first-(pref[v.first]-pref[i-1])-get(1,n,i,v.first,1).second;
	}
	for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...