Submission #1248019

#TimeUsernameProblemLanguageResultExecution timeMemory
1248019kaiboyTram (CEOI13_tram)C++20
100 / 100
114 ms16444 KiB
#include <algorithm>
#include <iostream>
#include <set>

using namespace std;

const int   N = 150000;
const int   M = 30000;
const int INF = 0x3f3f3f3f;

bool used[N][2];
int ii[M], jj[M], n;
set<int> ii_, qij;
set<pair<int, int>> pp;

int dist(int i0, int j0, int i1, int j1) {
	return i0 == i1 ? 2 : i1 - i0 << 1 ^ j0 != j1;
}

int dist_(int i, int j) {
	if (used[i][j ^ 1])
		return 2;
	int ans = INF;
	int i_ = *prev(ii_.lower_bound(i));
	if (i_ >= 0)
		for (int j_ = 0; j_ < 2; j_++)
			if (used[i_][j_])
				ans = min(ans, dist(i_, j_, i, j));
	i_ = *ii_.upper_bound(i);
	if (i_ < n)
		for (int j_ = 0; j_ < 2; j_++)
			if (used[i_][j_])
				ans = min(ans, dist(i, j, i_, j_));
	return ans;
}

int calc(int l, int r) {
	int il, ir;
	if (l == -1)
		il = ir = 0;
	else if (r == n)
		il = ir = n - 1;
	else
		il = (l + r) / 2, ir = (l + r + 1) / 2;
	int i_ = -1, j_ = -1;
	for (int i = il; i <= ir; i++)
		for (int j = 0; j < 2; j++)
			if (i_ == -1 || dist_(i_, j_) < dist_(i, j))
				i_ = i, j_ = j;
	return i_ << 1 ^ j_;
}

void add(int l, int r) {
	if (r - l < 2)
		return;
	int ij = calc(l, r), i = ij / 2, j = ij % 2;
	pp.insert({ -dist_(i, j), ij });
}

void remove(int l, int r) {
	if (r - l < 2)
		return;
	int ij = calc(l, r), i = ij / 2, j = ij % 2;
	pp.erase({ -dist_(i, j), ij });
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int q; cin >> n >> q;
	ii_.insert(-1), ii_.insert(n);
	for (int ij = 0; ij < n << 1; ij++)
		qij.insert(ij);
	add(-1, n);
	for (int h = 0; h < q; h++) {
		char c; cin >> c;
		if (c == 'E') {
			int ij = *qij.begin(), i = ij >> 1, j = ij & 1;
			if (!pp.empty()) {
				auto dij = *pp.begin();
				if (!used[i][j ^ 1] || -dij.first > 2) {
					pp.erase(dij), ij = dij.second, i = ij >> 1, j = ij & 1;
					used[ii[h] = i][jj[h] = j] = true;
					ii_.insert(i);
					qij.erase(ij);
					int l = *prev(ii_.lower_bound(i));
					int r = *ii_.upper_bound(i);
					add(l, i);
					add(i, r);
					cout << i + 1 << ' ' << j + 1 << '\n';
					continue;
				}
			}
			used[ii[h] = i][jj[h] = j] = true;
			qij.erase(ij);
			auto it = ii_.lower_bound(i);
			int l = *prev(it), r = *next(it);
			remove(l, i);
			remove(i, r);
			add(l, i);
			add(i, r);
			cout << i + 1 << ' ' << j + 1 << '\n';
		} else {
			int g; cin >> g, g--;
			int i = ii[g], j = jj[g], ij = i << 1 ^ j;
			auto it = ii_.lower_bound(i);
			int l = *prev(it), r = *next(it);
			if (!used[i][j ^ 1]) {
				remove(l, i);
				remove(i, r);
				used[i][j] = false;
				ii_.erase(i);
				qij.insert(ij);
				add(l, r);
			} else {
				remove(l, i);
				remove(i, r);
				used[i][j] = false;
				qij.insert(ij);
				add(l, i);
				add(i, r);
			}
		}
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...