Submission #87768

#TimeUsernameProblemLanguageResultExecution timeMemory
87768memikakizakiElection (BOI18_election)C++14
100 / 100
1155 ms120588 KiB
/**
 * code generated by JHelper
 * More info: https://github.com/AlexeyDmitriev/JHelper
 * @author
 */

#include <bits/stdc++.h>
using namespace std;
#define long long long
const long MOD = 1e9+7, LINF = 1e18 + 1e16;
const int INF = 1e9+1;
const double EPS = 1e-10;
const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
const int N = 1 << 19;

class Elections {

	int n, q, ans[N];
	string s;
	vector<pair<int,int> > qq[N];

	int mn[2*N], lz[2*N];
	void apply(int i, int l, int r) {
		if(!lz[i]) return;
		mn[i] += lz[i];
		if(i < N) {
			lz[i << 1] += lz[i];
			lz[i << 1 | 1] += lz[i];
		}
		lz[i] = 0;
	}
	void update_mn(int tl, int tr, int v, int i = 1, int l = 0, int r = N-1) {
		apply(i, l, r);
		if(r < tl || l > tr) return;
		if(tl <= l && r <= tr) {
			lz[i] += v;
			apply(i, l, r);
			return;
		}
		int mid = l+r >> 1;
		update_mn(tl, tr, v, i << 1, l, mid);
		update_mn(tl, tr, v, i << 1 | 1, mid+1, r);
		mn[i] = min(mn[i << 1], mn[i << 1 | 1]);
	}
	int query_mn(int tl, int tr, int i = 1, int l = 0, int r = N-1) {
		apply(i, l, r);
		if(r < tl || l > tr) return INF;
		if(tl <= l && r <= tr) return mn[i];
		int mid = l+r >> 1;
		return min(query_mn(tl, tr, i << 1, l, mid), query_mn(tl, tr, i << 1 | 1, mid+1, r));
	}

public:
	void run(istream &cin, ostream &cout) {
		cin >> n >> s >> q;
		for(int i = 0, l, r; i < q; i++) {
			cin >> l >> r;
			--l, --r;
			qq[r].emplace_back(l, i);
		}
		vector<int> ts;
		for(int i = 0; i < n; i++) {
			if(s[i] == 'T') ts.push_back(i);
			else {
				if(!ts.empty()) {
					update_mn(ts.back(), n-1, -1);
					ts.pop_back();
				}
				update_mn(i, n-1, 1);
			}
			for(auto p: qq[i]) {
				int j, qidx;
				tie(j, qidx) = p;
				int res = query_mn(j, i) - (j > 0 ? query_mn(j-1, j-1) : 0);
				auto it = lower_bound(ts.begin(), ts.end(), j);
				int cnt = (int) ts.size() - (it - ts.begin());
//				cout << qidx << ' ' << cnt << ' ' << res << endl;
				ans[qidx] = cnt - min(res, 0);
			}
		}
		for(int i = 0; i < q; i++) cout << ans[i] << '\n';
	}
};

class Solver {
public:
	void solve(std::istream& in, std::ostream& out) {
	    Elections *obj = new Elections();
		obj->run(in, out);
	}
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	Solver solver;
	std::istream& in(std::cin);
	std::ostream& out(std::cout);
	solver.solve(in, out);
	return 0;
}

Compilation message (stderr)

election.cpp: In member function 'void Elections::update_mn(int, int, int, int, int, int)':
election.cpp:40:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int mid = l+r >> 1;
             ~^~
election.cpp: In member function 'int Elections::query_mn(int, int, int, int, int)':
election.cpp:49:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int mid = l+r >> 1;
             ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...