Submission #301579

# Submission time Handle Problem Language Result Execution time Memory
301579 2020-09-18T04:58:15 Z jwvg0425 Connecting Supertrees (IOI20_supertrees) C++17
54 / 100
1000 ms 22296 KB
#include "supertrees.h"
#include <vector>
#include <set>

using namespace std;

int cpar[1005];
int tpar[1005];
vector<int> byTree[1005];

int tfind(int x)
{
	if (tpar[x] == x)
		return x;

	return tpar[x] = tfind(tpar[x]);
}

void tmerge(int x, int y)
{
	x = tfind(x);
	y = tfind(y);

	tpar[x] = y;
}

int cfind(int x)
{
	if (cpar[x] == x)
		return x;

	return cpar[x] = cfind(cpar[x]);
}

void cmerge(int x, int y)
{
	x = cfind(x);
	y = cfind(y);

	cpar[x] = y;
}

int construct(vector<vector<int>> p)
{
	int n = p.size();

	for (int i = 0; i < n; i++)
		cpar[i] = tpar[i] = i;

	vector<vector<int>> answer;
	for (int i = 0; i < n; i++)
	{
		vector<int> row;
		row.resize(n);
		answer.push_back(row);
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			if (p[i][j] == 0)
				continue;

			if (p[i][j] == 1)
			{
				if (tfind(i) == tfind(j))
					continue;

				tmerge(i, j);
				answer[i][j] = answer[j][i] = 1;
				continue;
			}

			if (p[i][j] >= 2)
				cmerge(i, j);
		}
	}

	for (int i = 0; i < n; i++)
	{
		byTree[tfind(i)].push_back(i);
		for (int j = i + 1; j < n; j++)
		{
			if (p[i][j] == 0)
			{
				if (cfind(i) == cfind(j) || tfind(i) == tfind(j))
					return 0;
			}

			if (p[i][j] == 1)
			{
				if (tfind(i) != tfind(j))
					return 0;
			}

			if (p[i][j] >= 2)
			{
				if (cfind(i) != cfind(j) || tfind(i) == tfind(j))
					return 0;
			}
		}
	}

	for (int i = 0; i < n; i++)
	{
		if (cfind(i) != i)
			continue;

		vector<int> cs;
		set<int> ts;

		for (int j = 0; j < n; j++)
		{
			if (cfind(j) != i)
				continue;

			cs.push_back(j);
			ts.insert(tfind(j));
		}

		set<int> cv;
		vector<int> tv;
		for (auto ti : ts)
		{
			tv.push_back(ti);

			for (auto &x : byTree[ti])
				for (auto &y : byTree[ti])
					if (p[x][y] != 1)
						return 0;

			for (auto &tj : ts)
			{
				if (ti == tj)
					continue;

				for (auto &x : byTree[ti])
					for (auto &y : byTree[tj])
						cv.insert(p[x][y]);
			}
		}

		int k = tv.size();

		if (k <= 1)
			continue;

		if (k == 2)
			return 0;

		if (cv.size() >= 2 || *cv.begin() < 2)
			return 0;

		for (int x = 0; x < k; x++)
		{
			int nx = (x + 1) % k;
			answer[tv[x]][tv[nx]] = answer[tv[nx]][tv[x]] = 1;
		}

		if (*cv.begin() == 3)
			answer[tv[0]][tv[2]] = answer[tv[2]][tv[0]] = 1;
	}

	build(answer);
	return 1;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 1 ms 288 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 19 ms 1280 KB Output is correct
7 Execution timed out 1064 ms 12152 KB Time limit exceeded
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 1 ms 288 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 19 ms 1280 KB Output is correct
7 Execution timed out 1064 ms 12152 KB Time limit exceeded
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 288 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 10 ms 1184 KB Output is correct
9 Correct 255 ms 22232 KB Output is correct
10 Correct 1 ms 288 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 11 ms 1280 KB Output is correct
13 Correct 278 ms 22296 KB Output is correct
14 Correct 0 ms 384 KB Output is correct
15 Correct 0 ms 384 KB Output is correct
16 Correct 6 ms 800 KB Output is correct
17 Correct 109 ms 12152 KB Output is correct
18 Correct 1 ms 384 KB Output is correct
19 Correct 1 ms 512 KB Output is correct
20 Correct 0 ms 384 KB Output is correct
21 Correct 62 ms 5880 KB Output is correct
22 Correct 263 ms 22120 KB Output is correct
23 Correct 249 ms 22136 KB Output is correct
24 Correct 265 ms 22168 KB Output is correct
25 Correct 102 ms 12280 KB Output is correct
26 Correct 99 ms 12152 KB Output is correct
27 Correct 244 ms 22204 KB Output is correct
28 Correct 268 ms 22136 KB Output is correct
29 Correct 102 ms 12260 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 63 ms 5880 KB Output is correct
5 Correct 286 ms 22136 KB Output is correct
6 Correct 253 ms 22120 KB Output is correct
7 Correct 541 ms 22136 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 62 ms 5880 KB Output is correct
10 Correct 250 ms 22136 KB Output is correct
11 Correct 249 ms 22136 KB Output is correct
12 Correct 270 ms 22120 KB Output is correct
13 Correct 1 ms 384 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 0 ms 384 KB Output is correct
16 Correct 61 ms 5880 KB Output is correct
17 Correct 281 ms 22136 KB Output is correct
18 Correct 254 ms 22136 KB Output is correct
19 Correct 248 ms 22264 KB Output is correct
20 Correct 250 ms 22136 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 1 ms 288 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 19 ms 1280 KB Output is correct
7 Execution timed out 1064 ms 12152 KB Time limit exceeded
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 1 ms 288 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 19 ms 1280 KB Output is correct
7 Execution timed out 1064 ms 12152 KB Time limit exceeded