Submission #71543

#TimeUsernameProblemLanguageResultExecution timeMemory
71543aomeElection (BOI18_election)C++17
100 / 100
551 ms105636 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 500005;
const int INF = 1e9;

struct Node {
	int sum, val;

	Node() { sum = val = 0; }

	void dbg() { cout << "#node " << sum << ' ' << val << '\n'; }
};

struct Query {
	int l, r, id;

	bool operator < (const Query& rhs) const {
		return l > rhs.l;
	}
};

int n, q, res[N];
string s;
Node T[N * 2];
vector<Query> queries;

Node combine(Node &x, Node &y) {
	Node ret;
	ret.sum = x.sum + y.sum;
	ret.val = min(y.val, x.val + y.sum);
	return ret;
}

void upd(int p, int x) {
	// cout << "#upd " << p << ' ' << x << '\n';
	p += n, T[p].sum = T[p].val = x;
	while (p > 1) {
		p >>= 1;
		T[p] = combine(T[p << 1], T[p << 1 | 1]);
		// cout << "#p " << p << '\n';
		// T[p].dbg();
	}
}

int get(int l, int r) {
	// cout << "#get " << l << ' ' << r << '\n';
	Node Tl, Tr;
	for (l += n, r += n; l <= r; l >>= 1, r >>= 1) {
		// cout << l << ' ' << r << '\n';
		if (l & 1) Tl = combine(Tl, T[l++]);
		if (!(r & 1)) Tr = combine(T[r--], Tr);
	}
	// Tl.dbg(), Tr.dbg();
	return combine(Tl, Tr).val;
}

int main() {
	ios::sync_with_stdio(false);
	cin >> n >> s >> q, s = ' ' + s;
	for (int i = 1; i <= q; ++i) {
		int l, r; cin >> l >> r;
		queries.push_back({l, r, i});
	}
	sort(queries.begin(), queries.end());
	int ptr = n;
	vector<int> vec;
	for (auto i : queries) {
		while (ptr >= i.l) {
			if (s[ptr] == 'T') vec.push_back(ptr);
			else {
				upd(ptr, 1);
				if (vec.size()) {
					int p = vec.back();
					upd(p, -1), vec.pop_back();
				}
			}
			--ptr;
		}
		// cout << get(i.l, i.r) << '\n';
		res[i.id] = upper_bound(vec.rbegin(), vec.rend(), i.r) - vec.rbegin() - get(i.l, i.r);
	}
	for (int i = 1; i <= q; ++i) cout << res[i] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...