Submission #1172237

#TimeUsernameProblemLanguageResultExecution timeMemory
1172237gygKeys (IOI21_keys)C++20
37 / 100
3096 ms33472 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 
const int N = 3e5 + 5;

// Zero indexing

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

arr<bool, N> vs;
arr<vec<int>, N> ngh;
set<int> cls;
vec<int> ord;
arr<int, N> cnt;
void cnt_cmp(int st) {
	vs.fill(false), ngh.fill({}), cls.clear(), ord.clear();
	vs[st] = true, ord.push_back(st);

	while (ord.size()) {
		int u = ord.back(); ord.pop_back();

		for (pii x : adj[u]) {
			if (cls.count(x.sec)) {
				if (vs[x.fir]) continue;
				vs[x.fir] = true;
				ord.push_back(x.fir);
			} else {
				ngh[x.sec].push_back(x.fir);
			}
		}

		if (cls.count(cl[u])) continue;
		cls.insert(cl[u]);
		for (int v : ngh[cl[u]]) {
			if (vs[v]) continue;
			vs[v] = true;
			ord.push_back(v);
		}
	}

	cnt[st] = accumulate(vs.begin(), vs.begin() + n, 0);
}

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});
	}

	for (int u = 0; u < n; u++) cnt_cmp(u);
	
	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...