Submission #435155

# Submission time Handle Problem Language Result Execution time Memory
435155 2021-06-23T04:26:01 Z Elegia Keys (IOI21_keys) C++17
0 / 100
2500 ms 204 KB
#include <bits/stdc++.h>

using namespace std;

void merge(set<int>& x, set<int>& y) {
	if (x.size() < y.size()) swap(x, y);
	for (int i : y) x.insert(i);
	y.clear();
}
void merge(map<int, list<int>>& x, map<int, list<int>>& y) {
	if (x.size() < y.size()) swap(x, y);
	for (auto it = y.begin(); it != y.end(); ++it) {
		list<int>& l = x[it->first];
		l.splice(l.begin(), it->second);
	}
	y.clear();
}

vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c) {
	int n = r.size(), m = u.size();
	vector<int> ans(n), dsu(n), sz(n, 1), vis(n);
	vector<set<int>> key(n);
	vector<map<int, list<int>>> candidate(n);
	vector<list<int>> edge(n);
	iota(dsu.begin(), dsu.end(), 0);
	function<int(int)> find = [&](int x) { return dsu[x] == x ? x : dsu[x] = find(dsu[x]); };
	auto activate = [&](const set<int>& kk, map<int, list<int>>& cc, list<int>& ed) {
		if (kk.size() < cc.size()) {
			for (int i : kk) {
				auto it = cc.find(i);
				if (it != cc.end()) {
					ed.splice(ed.begin(), it->second);
					cc.erase(it);
				}
			}
		} else {
			for (auto it = cc.begin(); it != cc.end();) if (kk.count(it->first)) {
				ed.splice(ed.begin(), it->second);
				cc.erase(it++);
			} else ++it;
		}
	};
	auto mer = [&](int x, int y) {
		x = find(x); y = find(y);
		if (x == y) return;
		activate(key[x], candidate[y], edge[x]);
		activate(key[y], candidate[x], edge[x]);
		edge[x].splice(edge[x].begin(), edge[y]);
		merge(key[x], key[y]);
		merge(candidate[x], candidate[y]);
		sz[x] += sz[y];
		dsu[y] = x;
	};

	for (int i = 0; i != m; ++i) {
		candidate[u[i]][c[i]].push_back(v[i]);
		candidate[v[i]][c[i]].push_back(u[i]);
	}
	for (int i = 0; i != n; ++i) {
		key[i].insert(r[i]);
		activate(key[i], candidate[i], edge[i]);
	}
	stack<int> stk, stky;
	auto push = [&](int x) {
		stk.push(x);
		stky.push(-1);
		vis[x] = -2;
	};
	auto simul = [&]() {
		while (!stk.empty()) {
			int x = stk.top(), y = stky.top();
			if (y == -1) {
				if (edge[x].empty()) {
					vis[x] = sz[x];
					stk.pop();
					stky.pop();
					continue;
				}
				y = find(edge[x].back());
				edge[x].pop_back();
			} else {
				y = find(y);
				if (vis[y] > 0 || vis[y] == -1) {
					vis[x] = -1;
					stk.pop();
					stky.pop();
					continue;
				}
				y = -1; continue;
			}
			if (y == x) { y = -1; continue; }
			if (vis[y] > 0 || vis[y] == -1) {
				vis[x] = -1;
				stk.pop();
				stky.pop();
				continue;
			}
			if (vis[y] == -2) {
				while (stk.top() != y) {
					stk.pop();
					stky.pop();
					mer(stk.top(), x);
				}
				continue;
			}
			stky.top() = y;
			push(y);
		}
	};
	for (int i = 0; i != n; ++i) if (dsu[i] == i && vis[i] == 0) {
		push(i);
		simul();
	}
	int minv = n + 1;
	for (int i = 0; i != n; ++i) if (vis[i] > 0) minv = min(minv, vis[i]);
	for (int i = 0; i != n; ++i) ans[i] = vis[find(i)] == minv;

	return ans;
}
# Verdict Execution time Memory Grader output
1 Execution timed out 2574 ms 204 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2574 ms 204 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2574 ms 204 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2574 ms 204 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2574 ms 204 KB Time limit exceeded
2 Halted 0 ms 0 KB -