Submission #60561

# Submission time Handle Problem Language Result Execution time Memory
60561 2018-07-24T10:53:50 Z aome Parachute rings (IOI12_rings) C++17
100 / 100
1504 ms 115900 KB
#include <bits/stdc++.h>

using namespace std;

const int N = 1000005;

int n;
int szCircle;
int sz[N], par[N];
bool noSolution;
vector<int> G[N];
vector< pair<int, int> > E;

struct DSU {
	int root;
	int valid;
	int par[N];
	int deg[N];

	int find(int u) { return u == par[u] ? u : par[u] = find(par[u]); }

	void join(int u, int v) { par[find(u)] = find(v); }

	void add(int u, int v) {
		if (!valid || u == root || v == root) return;
		int ru = find(u), rv = find(v);
		if (deg[u] == 2 || deg[v] == 2 || ru == rv) {
			valid = 0; return;
		}
		deg[u]++, deg[v]++;
		join(u, v);
	}

	DSU(int _root) {
		valid = 1, root = _root;
		for (int i = 0; i < n; ++i) {
			par[i] = i, deg[i] = 0;
		}
		for (auto i : E) add(i.first, i.second);
	}
};

vector<DSU> vec;

int find(int u) { return u == par[u] ? u : par[u] = find(par[u]); }

bool join(int u, int v) {
	u = find(u), v = find(v);
	if (u == v) return 0;
	sz[u] += sz[v], par[v] = u; return 1;
}

void Init(int _n) {
	n = _n;
	for (int i = 0; i < n; ++i) sz[i] = 1, par[i] = i;
}

void Link(int A, int B) {
	if (noSolution) return;
	if (vec.size()) {
		for (int i = 0; i < vec.size(); ++i) vec[i].add(A, B);
		return;
	}
	E.push_back({A, B});
	G[A].push_back(B), G[B].push_back(A);
	if (G[A].size() < G[B].size()) swap(A, B);
	if (G[A].size() == 3) {
		vec.push_back(DSU(A));
		for (auto i : G[A]) {
			vec.push_back(DSU(i));
		}
		return;
	}
	if (!join(A, B)) {
		if (szCircle) {
			noSolution = 1; return;
		}
		szCircle = sz[find(A)];
	}
}

int CountCritical() {
	if (noSolution) return 0;
	int res = 0;
	if (vec.size()) {
		for (int i = 0; i < vec.size(); ++i) res += vec[i].valid;
	}
	else if (szCircle) res = szCircle;
	else res = n;
	return res;
}

Compilation message

rings.cpp: In function 'void Link(int, int)':
rings.cpp:61:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < vec.size(); ++i) vec[i].add(A, B);
                   ~~^~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:86:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < vec.size(); ++i) res += vec[i].valid;
                   ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 22 ms 23800 KB Output is correct
2 Correct 68 ms 63220 KB Output is correct
3 Correct 65 ms 63280 KB Output is correct
4 Correct 22 ms 63280 KB Output is correct
5 Correct 25 ms 63280 KB Output is correct
6 Correct 24 ms 63280 KB Output is correct
7 Correct 64 ms 63280 KB Output is correct
8 Correct 25 ms 63280 KB Output is correct
9 Correct 68 ms 63404 KB Output is correct
10 Correct 68 ms 63532 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 519 ms 63532 KB Output is correct
2 Correct 718 ms 91824 KB Output is correct
3 Correct 395 ms 91824 KB Output is correct
4 Correct 1321 ms 91824 KB Output is correct
5 Correct 1403 ms 91824 KB Output is correct
6 Correct 1295 ms 91824 KB Output is correct
7 Correct 374 ms 91824 KB Output is correct
8 Correct 1344 ms 109376 KB Output is correct
9 Correct 1504 ms 115900 KB Output is correct
10 Correct 938 ms 115900 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 23800 KB Output is correct
2 Correct 68 ms 63220 KB Output is correct
3 Correct 65 ms 63280 KB Output is correct
4 Correct 22 ms 63280 KB Output is correct
5 Correct 25 ms 63280 KB Output is correct
6 Correct 24 ms 63280 KB Output is correct
7 Correct 64 ms 63280 KB Output is correct
8 Correct 25 ms 63280 KB Output is correct
9 Correct 68 ms 63404 KB Output is correct
10 Correct 68 ms 63532 KB Output is correct
11 Correct 66 ms 115900 KB Output is correct
12 Correct 70 ms 115900 KB Output is correct
13 Correct 72 ms 115900 KB Output is correct
14 Correct 66 ms 115900 KB Output is correct
15 Correct 75 ms 115900 KB Output is correct
16 Correct 29 ms 115900 KB Output is correct
17 Correct 68 ms 115900 KB Output is correct
18 Correct 69 ms 115900 KB Output is correct
19 Correct 27 ms 115900 KB Output is correct
20 Correct 71 ms 115900 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 23800 KB Output is correct
2 Correct 68 ms 63220 KB Output is correct
3 Correct 65 ms 63280 KB Output is correct
4 Correct 22 ms 63280 KB Output is correct
5 Correct 25 ms 63280 KB Output is correct
6 Correct 24 ms 63280 KB Output is correct
7 Correct 64 ms 63280 KB Output is correct
8 Correct 25 ms 63280 KB Output is correct
9 Correct 68 ms 63404 KB Output is correct
10 Correct 68 ms 63532 KB Output is correct
11 Correct 66 ms 115900 KB Output is correct
12 Correct 70 ms 115900 KB Output is correct
13 Correct 72 ms 115900 KB Output is correct
14 Correct 66 ms 115900 KB Output is correct
15 Correct 75 ms 115900 KB Output is correct
16 Correct 29 ms 115900 KB Output is correct
17 Correct 68 ms 115900 KB Output is correct
18 Correct 69 ms 115900 KB Output is correct
19 Correct 27 ms 115900 KB Output is correct
20 Correct 71 ms 115900 KB Output is correct
21 Correct 43 ms 115900 KB Output is correct
22 Correct 57 ms 115900 KB Output is correct
23 Correct 69 ms 115900 KB Output is correct
24 Correct 100 ms 115900 KB Output is correct
25 Correct 80 ms 115900 KB Output is correct
26 Correct 117 ms 115900 KB Output is correct
27 Correct 79 ms 115900 KB Output is correct
28 Correct 94 ms 115900 KB Output is correct
29 Correct 101 ms 115900 KB Output is correct
30 Correct 96 ms 115900 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 23800 KB Output is correct
2 Correct 68 ms 63220 KB Output is correct
3 Correct 65 ms 63280 KB Output is correct
4 Correct 22 ms 63280 KB Output is correct
5 Correct 25 ms 63280 KB Output is correct
6 Correct 24 ms 63280 KB Output is correct
7 Correct 64 ms 63280 KB Output is correct
8 Correct 25 ms 63280 KB Output is correct
9 Correct 68 ms 63404 KB Output is correct
10 Correct 68 ms 63532 KB Output is correct
11 Correct 519 ms 63532 KB Output is correct
12 Correct 718 ms 91824 KB Output is correct
13 Correct 395 ms 91824 KB Output is correct
14 Correct 1321 ms 91824 KB Output is correct
15 Correct 1403 ms 91824 KB Output is correct
16 Correct 1295 ms 91824 KB Output is correct
17 Correct 374 ms 91824 KB Output is correct
18 Correct 1344 ms 109376 KB Output is correct
19 Correct 1504 ms 115900 KB Output is correct
20 Correct 938 ms 115900 KB Output is correct
21 Correct 66 ms 115900 KB Output is correct
22 Correct 70 ms 115900 KB Output is correct
23 Correct 72 ms 115900 KB Output is correct
24 Correct 66 ms 115900 KB Output is correct
25 Correct 75 ms 115900 KB Output is correct
26 Correct 29 ms 115900 KB Output is correct
27 Correct 68 ms 115900 KB Output is correct
28 Correct 69 ms 115900 KB Output is correct
29 Correct 27 ms 115900 KB Output is correct
30 Correct 71 ms 115900 KB Output is correct
31 Correct 43 ms 115900 KB Output is correct
32 Correct 57 ms 115900 KB Output is correct
33 Correct 69 ms 115900 KB Output is correct
34 Correct 100 ms 115900 KB Output is correct
35 Correct 80 ms 115900 KB Output is correct
36 Correct 117 ms 115900 KB Output is correct
37 Correct 79 ms 115900 KB Output is correct
38 Correct 94 ms 115900 KB Output is correct
39 Correct 101 ms 115900 KB Output is correct
40 Correct 96 ms 115900 KB Output is correct
41 Correct 267 ms 115900 KB Output is correct
42 Correct 647 ms 115900 KB Output is correct
43 Correct 277 ms 115900 KB Output is correct
44 Correct 381 ms 115900 KB Output is correct
45 Correct 492 ms 115900 KB Output is correct
46 Correct 839 ms 115900 KB Output is correct
47 Correct 1100 ms 115900 KB Output is correct
48 Correct 338 ms 115900 KB Output is correct
49 Correct 817 ms 115900 KB Output is correct
50 Correct 899 ms 115900 KB Output is correct
51 Correct 300 ms 115900 KB Output is correct
52 Correct 365 ms 115900 KB Output is correct
53 Correct 328 ms 115900 KB Output is correct
54 Correct 995 ms 115900 KB Output is correct
55 Correct 461 ms 115900 KB Output is correct