Submission #471238

#TimeUsernameProblemLanguageResultExecution timeMemory
471238disastahElection (BOI18_election)C++17
100 / 100
971 ms39436 KiB
#include <bits/stdc++.h>
#define ar array
using namespace std;
typedef long double ld;
typedef long long ll;
const int inf=2e9+9;
const ll linf=4e18+18;
const int N=5e5;

struct segtr {
	struct node {
		int ans, ansup, ansdown;
	};
	string s;
	vector<int> a, b;
	vector<node> t;
	int n;
	segtr(string &s, int n): s(s), n(n) {
		a.resize(n+1); a[0]=0;
		b.resize(n+1); b[n]=0;
		for (int i=0; i<n; ++i) a[i+1]=a[i]+(s[i]=='C'?1:-1);
		for (int i=n-1; ~i; --i) b[i]=b[i+1]+(s[i]=='C'?1:-1);
		t.resize(n*4);
	}
	void comb(int v, int l, int r) {
		int m=(l+r)/2;
		t[v].ans=t[2*v+1].ansup+t[2*v+2].ansdown;
		int x1=max(0,t[2*v+1].ans-t[2*v+1].ansup-t[2*v+2].ansdown-(b[m]-b[r]));
		int x2=max(0,t[2*v+2].ans-t[2*v+2].ansdown-t[2*v+1].ansup-(a[m]-a[l]));
		t[v].ans+=max(x1,x2);
		t[v].ansup=max(t[2*v+1].ansup,t[2*v+2].ansup-(a[m]-a[l]));
		t[v].ansdown=max(t[2*v+1].ansdown-(b[m]-b[r]),t[2*v+2].ansdown);
	}
	void build(int v, int l, int r) {
		if (l+1==r) {
			if (s[l]=='C') t[v].ans=t[v].ansup=t[v].ansdown=0;
			else t[v].ans=t[v].ansup=t[v].ansdown=1;
		}
		else {
			int m=(l+r)/2;
			build(2*v+1,l,m);
			build(2*v+2,m,r);
			comb(v,l,r);
		}
	} void build() {build(0,0,n);}
	node qry(int v, int tl, int tr, int l, int r) {
		if (l>=r) return {};
		if (tl==l&&tr==r) return t[v];
		int tm=(tl+tr)/2;
		node L=qry(2*v+1,tl,tm,l,min(r,tm)), R=qry(2*v+2,tm,tr,max(l,tm),r);
		if (l>=min(r,tm)) return R;
		if (max(l,tm)>=r) return L;
		node S={};
		S.ans=L.ansup+R.ansdown;
		int x1=max(0,L.ans-L.ansup-R.ansdown-(b[tm]-b[r]));
		int x2=max(0,R.ans-R.ansdown-L.ansup-(a[tm]-a[l]));
		S.ans+=max(x1,x2);
		S.ansup=max(L.ansup,R.ansup-(a[tm]-a[l]));
		S.ansdown=max(L.ansdown-(b[tm]-b[r]),R.ansdown);
		return S;
	} int qry(int l, int r) {
		node ans=qry(0,0,n,l,r);
		return ans.ans;
	}
	void print() {
		for (int i=0; i<n*4; ++i) {
			cout << t[i].ans << " " << t[i].ansup << " " << t[i].ansdown << "\n";
		}
	}
};

int n, q;
string s;

void solve() {
	cin >> n >> s;
	segtr tr(s,n); tr.build();
	cin >> q;
	while(q--) {
		int l, r; cin >> l >> r; --l;
		cout << tr.qry(l,r) << "\n";
		//tr.print();
		//cout << "\n--------------\n";
	}
}

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
#ifdef disastah
	cout << "Output\n\n";
#endif
/*#ifndef disastah
	freopen("cardgame.in","r",stdin);
	freopen("cardgame.out","w",stdout);
#endif*/
	int tt=1;
//	cin >> tt;
	while (tt--) {
		solve();
		cout << "\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...