Submission #60576

#TimeUsernameProblemLanguageResultExecution timeMemory
60576aomeParachute rings (IOI12_rings)C++17
100 / 100
1126 ms77780 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 1000005;

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

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 (int i = 0; i < m; ++i) add(E[i].first, E[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[m++] = {A, B};
	G[A][deg[A]++] = B;
	G[B][deg[B]++] = A;
	if (deg[A] < deg[B]) swap(A, B);
	if (deg[A] == 3) {
		vec.push_back(DSU(A));
		for (int i = 0; i < 3; ++i) {
			vec.push_back(DSU(G[A][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 (stderr)

rings.cpp: In function 'void Link(int, int)':
rings.cpp:60: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 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...