답안 #829670

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
829670 2023-08-18T14:01:18 Z faruk 슈퍼트리 잇기 (IOI20_supertrees) C++17
11 / 100
177 ms 26576 KB
#include "supertrees.h"
#include <iostream>
#include <vector>
#include <algorithm>
#define mp make_pair
#define all(a) a.begin(), a.end()

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

vector<vector<int> > out;

int n;
bool check_components(vector<vector<int> > p) {
	vector<int> comp(n, -1);
	for (int i = 0; i < n; i++) {
		if (p[i][i] != 1)
			return false;
		if (comp[i] == -1) {
			for (int j = 0; j < n; j++) {
				if (p[i][j] != 0 and comp[j] != -1)
					return false;
				if (p[i][j] != 0)
					comp[j] = i;
			}
		}
		else {
			for (int j = 0; j < n; j++)
				if (p[i][j] != 0 and comp[j] != comp[i])
					return false;
		}
	}
	return true;
}

void make_line(vector<int> a) {
	if (a.size() == 1)
		return;
	for (int i = 0; i < a.size() - 1; i++)
	{
		int f = a[i], s = a[i + 1];
		out[f][s] = 1, out[s][f] = 1;
	}
}
vector<vector<int> > p;
vector<bool> vis;
vector<int> ch;
void dfs(int c) {
	ch.push_back(c);
	vis[c] = true;
	for (int i = 0; i < n; i++) {
		if (p[i][c] == 1 and !vis[i])
			dfs(i);
	} 
}

int construct(std::vector<std::vector<int>> p) {
	n = p.size();
	::p = p;
	std::vector<std::vector<int>> answer;
	if (check_components(p) == false)
		return 0;
	vector<bool> visited(n);
	out = vector<vector<int> >(n, vector<int>(n, 0));
	for (int i = 0; i < n; i++) {
		if (visited[i])
			continue;
		vector<int> mine;
		for (int j = 0; j < n; j++)
			if (p[i][j] != 0)
				mine.push_back(j), visited[j] = true;
		if (mine.size() == 1)
			continue;

		vector<int> all2, everyone_else;
		for (int a : mine) {
			bool has1 = false;
			for (int j : mine)
				if (p[a][j] == 1 and j != a)
					has1 = true;
			if (has1)
				everyone_else.push_back(a);
			else
				all2.push_back(a);
		}
		vector<vector<int> > chains;
		vis = vector<bool>(n);
		for (int a : everyone_else) {
			// now we decompose into sub-chains
			ch.clear();
			if (!vis[a]) {
				dfs(a);
				chains.push_back(ch);
			}
		}

		// now check if chains are good
		for (int i = 0; i < chains.size(); i++) {
			for (int j = i+1; j < chains.size(); j++) {
				for (int a : chains[i])
					for (int b : chains[j])
						if (p[a][b] != 2)
							return 0;
			}
		}

		if (everyone_else.size() == 0) { // cycle
			if (all2.size() <= 2)
				return 0;
			for (int i = 0; i < all2.size(); i++)
			{
				int f = all2[i], s = i < (all2.size() - 1) ? all2[i + 1] : all2[0];
				out[f][s] = 1, out[s][f] = 1;
			}
		}
		else if (all2.size() == 0) {// line
			make_line(everyone_else);
		}
		else {
			// made cycle chain
			if (all2.size() + chains.size() <= 2)
				return 0;
			make_line(all2);

			// made one chain
			for (vector<int> chai : chains)
				make_line(chai);

			// connecting chains and cyc
			vector<int> fin = { all2[0] };
			for (int i = 0; i < chains.size(); i++)
				fin.push_back(chains[i][0]);
			fin.push_back(all2.back());
			make_line(fin);
		}
	}
	build(out);
	return 1;
}

Compilation message

supertrees.cpp: In function 'void make_line(std::vector<int>)':
supertrees.cpp:41:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |  for (int i = 0; i < a.size() - 1; i++)
      |                  ~~^~~~~~~~~~~~~~
supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:100:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |   for (int i = 0; i < chains.size(); i++) {
      |                   ~~^~~~~~~~~~~~~~~
supertrees.cpp:101:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |    for (int j = i+1; j < chains.size(); j++) {
      |                      ~~^~~~~~~~~~~~~~~
supertrees.cpp:112:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |    for (int i = 0; i < all2.size(); i++)
      |                    ~~^~~~~~~~~~~~~
supertrees.cpp:114:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |     int f = all2[i], s = i < (all2.size() - 1) ? all2[i + 1] : all2[0];
      |                          ~~^~~~~~~~~~~~~~~~~~~
supertrees.cpp:133:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |    for (int i = 0; i < chains.size(); i++)
      |                    ~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 8 ms 1436 KB Output is correct
7 Correct 159 ms 26536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 8 ms 1436 KB Output is correct
7 Correct 159 ms 26536 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 7 ms 1364 KB Output is correct
13 Correct 156 ms 26508 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 1 ms 296 KB Output is correct
16 Correct 3 ms 980 KB Output is correct
17 Correct 63 ms 16488 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Incorrect 0 ms 212 KB Answer gives possible 1 while actual possible 0
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 296 KB Output is correct
8 Correct 11 ms 1388 KB Output is correct
9 Correct 161 ms 26576 KB Output is correct
10 Correct 1 ms 300 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 7 ms 1332 KB Output is correct
13 Correct 156 ms 26464 KB Output is correct
14 Correct 0 ms 300 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 3 ms 980 KB Output is correct
17 Correct 63 ms 16512 KB Output is correct
18 Incorrect 0 ms 212 KB Answer gives possible 1 while actual possible 0
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 39 ms 6996 KB Output is correct
5 Correct 160 ms 26428 KB Output is correct
6 Correct 162 ms 26456 KB Output is correct
7 Correct 164 ms 26472 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 40 ms 7012 KB Output is correct
10 Correct 177 ms 26504 KB Output is correct
11 Correct 156 ms 26432 KB Output is correct
12 Correct 161 ms 26440 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 0 ms 300 KB Output is correct
16 Incorrect 41 ms 6904 KB Too few ways to get from 0 to 24, should be 2 found 1
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 8 ms 1436 KB Output is correct
7 Correct 159 ms 26536 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 7 ms 1364 KB Output is correct
13 Correct 156 ms 26508 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 1 ms 296 KB Output is correct
16 Correct 3 ms 980 KB Output is correct
17 Correct 63 ms 16488 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Incorrect 0 ms 212 KB Answer gives possible 1 while actual possible 0
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 8 ms 1436 KB Output is correct
7 Correct 159 ms 26536 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 7 ms 1364 KB Output is correct
13 Correct 156 ms 26508 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 1 ms 296 KB Output is correct
16 Correct 3 ms 980 KB Output is correct
17 Correct 63 ms 16488 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Incorrect 0 ms 212 KB Answer gives possible 1 while actual possible 0
20 Halted 0 ms 0 KB -