Submission #827110

# Submission time Handle Problem Language Result Execution time Memory
827110 2023-08-16T08:49:21 Z Sohsoh84 Keys (IOI21_keys) C++17
100 / 100
2638 ms 166024 KB
#include "keys.h"
#include <bits/stdc++.h>

using namespace std;

#define sep		' '
#define debug(x)	cerr << #x << ": " << x << endl;

const int MAXN = 1e6 + 10;

int sz[MAXN], F[MAXN], par[MAXN], n, m, R[MAXN], T[MAXN], from[MAXN], to[MAXN];
bool dead[MAXN], vis[MAXN], tvis[MAXN];
vector<int> dfs_vec, C[MAXN], adj[MAXN];
bool dfs_finished;

inline int f(int ind, int v) {
	return from[ind] ^ to[ind] ^ v;
}

inline bool unite(int u, int v) { // check the order
	u = par[u], v = par[v];
	if (u == v) return false;

	int tf = F[v];
	
	if (C[u].size() < C[v].size()) swap(u, v);
	for (int e : C[v]) {
		par[e] = u;
		C[u].push_back(e);
	}

	F[u] = tf;
	C[v].clear();

	return true;
}

int fuck;
vector<int> key_vis, vert_vis, unlock[MAXN];
set<int> keys;

void add_key(int x);

void add_vert(int v) {
	if (dfs_finished) return;

	if (par[v] != fuck) {
		if (dead[v]) {
			for (int e : C[fuck])
				dead[e] = true, sz[e] = MAXN;
		} else {
			unite(fuck, v);
			tvis[par[v]] = true;
		}

		dfs_finished = true;
		return;
	}

	if (vis[v]) return;


	dfs_vec.push_back(v);

	vis[v] = true;
	vert_vis.push_back(v);
	add_key(R[v]);

	for (int ind : adj[v]) {
		key_vis.push_back(T[ind]);
		if (keys.find(T[ind]) != keys.end())
			add_vert(f(ind, v));
		else
			unlock[T[ind]].push_back(f(ind, v));
	
		if (dfs_finished) return;
	}
}

void add_key(int x) {
	if (dfs_finished) return;

	key_vis.push_back(x);
	keys.insert(x);
	for (int e : unlock[x]) {
		add_vert(e);

		if (dfs_finished) return;
	}
}

inline void bruvka() {
	memset(tvis, false, sizeof tvis);
	for (int vv = 0; vv < n; vv++) {
		if (!dead[vv] && !tvis[par[vv]]) {
			int v = F[par[vv]];
			fuck = par[vv];

			add_vert(v);	
			if (!dfs_finished) {
				for (int e : dfs_vec)
					sz[e] = dfs_vec.size();
			
				for (int e : C[fuck]) {
					dead[e] = true;
					if (!sz[e]) sz[e] = MAXN;
				}
			}

			dfs_finished = false;
			for (int e : dfs_vec) vis[e] = false;
			dfs_vec.clear();
	
			keys.clear();
			for (int e : key_vis) unlock[e].clear();
			for (int e : vert_vis) vis[e] = false;

			key_vis.clear();
			vert_vis.clear();
		}
	}
}

vector<int> find_reachable(vector<int> r_, vector<int> u_, vector<int> v_, vector<int> c_) {
	n = r_.size(), m = u_.size();
	for (int i = 0; i < m; i++) {
		adj[u_[i]].push_back(i);
		adj[v_[i]].push_back(i);
		from[i] = v_[i];
		to[i] = u_[i];
		T[i] = c_[i];
	}

	for (int i = 0; i < n; i++)
		R[i] = r_[i];

	vector<int> fans(r_.size(), 1);
	
	for (int i = 0; i < n; i++) {
		par[i] = i;
		C[i] = {i};
		F[i] = i;
	}

	for (int i = 0; i < 20; i++) // TODO
		bruvka();
/*	
	for (int i = 0; i < n; i++) {
		cerr << F[par[i]] << sep;
	}

	cerr << endl;

	for (int i = 0; i < n; i++)
		cerr << sz[i] << sep;
	cerr << endl;
*/
	int mn = *min_element(sz, sz + n);
	for (int i = 0; i < n; i++)
		fans[i] = (sz[i] == mn);

	return fans;
}
# Verdict Execution time Memory Grader output
1 Correct 64 ms 71756 KB Output is correct
2 Correct 39 ms 71760 KB Output is correct
3 Correct 39 ms 71772 KB Output is correct
4 Correct 38 ms 71804 KB Output is correct
5 Correct 38 ms 71700 KB Output is correct
6 Correct 42 ms 71732 KB Output is correct
7 Correct 45 ms 71748 KB Output is correct
8 Correct 37 ms 71756 KB Output is correct
9 Correct 41 ms 71748 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 64 ms 71756 KB Output is correct
2 Correct 39 ms 71760 KB Output is correct
3 Correct 39 ms 71772 KB Output is correct
4 Correct 38 ms 71804 KB Output is correct
5 Correct 38 ms 71700 KB Output is correct
6 Correct 42 ms 71732 KB Output is correct
7 Correct 45 ms 71748 KB Output is correct
8 Correct 37 ms 71756 KB Output is correct
9 Correct 41 ms 71748 KB Output is correct
10 Correct 38 ms 71712 KB Output is correct
11 Correct 45 ms 71800 KB Output is correct
12 Correct 52 ms 71800 KB Output is correct
13 Correct 57 ms 71680 KB Output is correct
14 Correct 43 ms 71664 KB Output is correct
15 Correct 39 ms 71756 KB Output is correct
16 Correct 46 ms 71784 KB Output is correct
17 Correct 38 ms 71680 KB Output is correct
18 Correct 43 ms 71760 KB Output is correct
19 Correct 46 ms 71732 KB Output is correct
20 Correct 38 ms 71784 KB Output is correct
21 Correct 38 ms 71776 KB Output is correct
22 Correct 37 ms 71732 KB Output is correct
23 Correct 38 ms 71752 KB Output is correct
24 Correct 38 ms 71804 KB Output is correct
25 Correct 38 ms 71864 KB Output is correct
26 Correct 38 ms 71724 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 64 ms 71756 KB Output is correct
2 Correct 39 ms 71760 KB Output is correct
3 Correct 39 ms 71772 KB Output is correct
4 Correct 38 ms 71804 KB Output is correct
5 Correct 38 ms 71700 KB Output is correct
6 Correct 42 ms 71732 KB Output is correct
7 Correct 45 ms 71748 KB Output is correct
8 Correct 37 ms 71756 KB Output is correct
9 Correct 41 ms 71748 KB Output is correct
10 Correct 38 ms 71712 KB Output is correct
11 Correct 45 ms 71800 KB Output is correct
12 Correct 52 ms 71800 KB Output is correct
13 Correct 57 ms 71680 KB Output is correct
14 Correct 43 ms 71664 KB Output is correct
15 Correct 39 ms 71756 KB Output is correct
16 Correct 46 ms 71784 KB Output is correct
17 Correct 38 ms 71680 KB Output is correct
18 Correct 43 ms 71760 KB Output is correct
19 Correct 46 ms 71732 KB Output is correct
20 Correct 38 ms 71784 KB Output is correct
21 Correct 38 ms 71776 KB Output is correct
22 Correct 37 ms 71732 KB Output is correct
23 Correct 38 ms 71752 KB Output is correct
24 Correct 38 ms 71804 KB Output is correct
25 Correct 38 ms 71864 KB Output is correct
26 Correct 38 ms 71724 KB Output is correct
27 Correct 39 ms 72032 KB Output is correct
28 Correct 41 ms 72012 KB Output is correct
29 Correct 46 ms 72104 KB Output is correct
30 Correct 40 ms 71900 KB Output is correct
31 Correct 41 ms 71884 KB Output is correct
32 Correct 39 ms 71772 KB Output is correct
33 Correct 45 ms 71908 KB Output is correct
34 Correct 44 ms 72060 KB Output is correct
35 Correct 41 ms 72064 KB Output is correct
36 Correct 40 ms 71956 KB Output is correct
37 Correct 47 ms 72348 KB Output is correct
38 Correct 61 ms 72124 KB Output is correct
39 Correct 48 ms 72420 KB Output is correct
40 Correct 43 ms 71900 KB Output is correct
41 Correct 47 ms 71924 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 64 ms 71756 KB Output is correct
2 Correct 39 ms 71760 KB Output is correct
3 Correct 39 ms 71772 KB Output is correct
4 Correct 38 ms 71804 KB Output is correct
5 Correct 38 ms 71700 KB Output is correct
6 Correct 42 ms 71732 KB Output is correct
7 Correct 45 ms 71748 KB Output is correct
8 Correct 37 ms 71756 KB Output is correct
9 Correct 41 ms 71748 KB Output is correct
10 Correct 277 ms 110344 KB Output is correct
11 Correct 2638 ms 124964 KB Output is correct
12 Correct 75 ms 79436 KB Output is correct
13 Correct 341 ms 111536 KB Output is correct
14 Correct 250 ms 160880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 64 ms 71756 KB Output is correct
2 Correct 39 ms 71760 KB Output is correct
3 Correct 39 ms 71772 KB Output is correct
4 Correct 38 ms 71804 KB Output is correct
5 Correct 38 ms 71700 KB Output is correct
6 Correct 42 ms 71732 KB Output is correct
7 Correct 45 ms 71748 KB Output is correct
8 Correct 37 ms 71756 KB Output is correct
9 Correct 41 ms 71748 KB Output is correct
10 Correct 38 ms 71712 KB Output is correct
11 Correct 45 ms 71800 KB Output is correct
12 Correct 52 ms 71800 KB Output is correct
13 Correct 57 ms 71680 KB Output is correct
14 Correct 43 ms 71664 KB Output is correct
15 Correct 39 ms 71756 KB Output is correct
16 Correct 46 ms 71784 KB Output is correct
17 Correct 38 ms 71680 KB Output is correct
18 Correct 43 ms 71760 KB Output is correct
19 Correct 46 ms 71732 KB Output is correct
20 Correct 38 ms 71784 KB Output is correct
21 Correct 38 ms 71776 KB Output is correct
22 Correct 37 ms 71732 KB Output is correct
23 Correct 38 ms 71752 KB Output is correct
24 Correct 38 ms 71804 KB Output is correct
25 Correct 38 ms 71864 KB Output is correct
26 Correct 38 ms 71724 KB Output is correct
27 Correct 39 ms 72032 KB Output is correct
28 Correct 41 ms 72012 KB Output is correct
29 Correct 46 ms 72104 KB Output is correct
30 Correct 40 ms 71900 KB Output is correct
31 Correct 41 ms 71884 KB Output is correct
32 Correct 39 ms 71772 KB Output is correct
33 Correct 45 ms 71908 KB Output is correct
34 Correct 44 ms 72060 KB Output is correct
35 Correct 41 ms 72064 KB Output is correct
36 Correct 40 ms 71956 KB Output is correct
37 Correct 47 ms 72348 KB Output is correct
38 Correct 61 ms 72124 KB Output is correct
39 Correct 48 ms 72420 KB Output is correct
40 Correct 43 ms 71900 KB Output is correct
41 Correct 47 ms 71924 KB Output is correct
42 Correct 277 ms 110344 KB Output is correct
43 Correct 2638 ms 124964 KB Output is correct
44 Correct 75 ms 79436 KB Output is correct
45 Correct 341 ms 111536 KB Output is correct
46 Correct 250 ms 160880 KB Output is correct
47 Correct 38 ms 71772 KB Output is correct
48 Correct 38 ms 71688 KB Output is correct
49 Correct 38 ms 71756 KB Output is correct
50 Correct 196 ms 141384 KB Output is correct
51 Correct 220 ms 144408 KB Output is correct
52 Correct 272 ms 107384 KB Output is correct
53 Correct 358 ms 107408 KB Output is correct
54 Correct 352 ms 107452 KB Output is correct
55 Correct 397 ms 113316 KB Output is correct
56 Correct 392 ms 124580 KB Output is correct
57 Correct 276 ms 119052 KB Output is correct
58 Correct 416 ms 130636 KB Output is correct
59 Correct 617 ms 134932 KB Output is correct
60 Correct 686 ms 152684 KB Output is correct
61 Correct 658 ms 154484 KB Output is correct
62 Correct 1164 ms 132904 KB Output is correct
63 Correct 187 ms 108776 KB Output is correct
64 Correct 38 ms 73324 KB Output is correct
65 Correct 39 ms 73500 KB Output is correct
66 Correct 1237 ms 126716 KB Output is correct
67 Correct 63 ms 81364 KB Output is correct
68 Correct 68 ms 87972 KB Output is correct
69 Correct 621 ms 134812 KB Output is correct
70 Correct 101 ms 103772 KB Output is correct
71 Correct 245 ms 166024 KB Output is correct
72 Correct 575 ms 135008 KB Output is correct
73 Correct 1106 ms 133116 KB Output is correct