Submission #1174879

#TimeUsernameProblemLanguageResultExecution timeMemory
1174879gygKeys (IOI21_keys)C++20
0 / 100
4 ms8520 KiB
#include "keys.h"
#include <bits/stdc++.h>
using namespace std;
#define vec vector
#define arr array 
#define pii pair<int, int>
#define fir first 
#define sec second 
#define hset unordered_set
#define hmap unordered_map
const int N = 3e5 + 5, INF = 1e9;

// Zero indexing

int n;
arr<int, N> cl;
arr<vec<pii>, N> adj;

struct Dsj {
	arr<int, N> prnt;
	void intl() {
		for (int u = 0; u < n; u++)
			prnt[u] = u;
	}
	int pr(int u) {
		return (prnt[u] == u) ? u : prnt[u] = pr(prnt[u]);
	}
	void mrg(int u, int v) { // v into u
		u = pr(u), v = pr(v);
		assert(u != v);
		prnt[v] = u;
	}
} dsj;

vec<pii> mrgs;
hset<int> vs, cls;
hmap<int, vec<int>> ngh;
vec<int> ord;
void bfs(int st) {
	vs.clear(), cls.clear(), ngh.clear(), ord.clear();
	vs.insert(st), ord.push_back(st);

	while (ord.size()) {
		int u = ord.back(); ord.pop_back();
	
		for (pii x : adj[u]) {
			int v = x.fir, c = x.sec;
			if (cls.count(c)) {
				if (dsj.pr(v) != dsj.pr(st)) {
					mrgs.push_back({v, st});
					return;
				}
				if (vs.count(v)) continue;
				vs.insert(v);
				ord.push_back(v);
			} else {
				ngh[c].push_back(v);
			}
		}

		if (cls.count(cl[u])) return;
		cls.insert(cl[u]);
		for (int v : ngh[cl[u]]) {
			if (dsj.pr(v) != dsj.pr(st)) {
				mrgs.push_back({v, st});
				return;
			}
			if (vs.count(v)) continue;
			vs.insert(v);
			ord.push_back(v);
		}
	}
}

arr<int, N> cnt;
void cnt_cmp() {
	dsj.intl();
	while (true) {
		for (int u = 0; u < n; u++) {
			if (dsj.pr(u) != u) continue;
			bfs(u);
		}
		if (mrgs.empty()) break;
		for (pii x : mrgs)
			if (dsj.pr(x.fir) != dsj.pr(x.sec))
				dsj.mrg(x.fir, x.sec);
		mrgs.clear();
	}

	cnt.fill(INF);
	for (int u = 0; u < n; u++) {
		if (dsj.pr(u) != u) continue;
		bfs(u);
		for (int v : vs)
			cnt[v] = vs.size();
	}
}

vec<int> find_reachable(vec<int> _cl, vec<int> _u, vec<int> _v, vec<int> _c) {
	n = _cl.size();
	for (int u = 0; u < n; u++) cl[u] = _cl[u];
	for (int i = 0; i < _u.size(); i++) {
		int u = _u[i], v = _v[i], c = _c[i];
		adj[u].push_back({v, c});
		adj[v].push_back({u, c});
	}

	cnt_cmp();

	vec<int> ans(n);
	int mn = *min_element(cnt.begin(), cnt.begin() + n);
	for (int u = 0; u < n; u++)	
		if (cnt[u] == mn) ans[u] = 1;
	return ans;
}
#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...