Submission #1313247

#TimeUsernameProblemLanguageResultExecution timeMemory
1313247TroySerSplit the Attractions (IOI19_split)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h>
#include "split.h"

using namespace std;
using ll = int;

vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q) {
	
	// Subtask 2: a = 1
	// subset A is guaranteed to be connected, since it only has 1 attraction

	ll M = p.size();

	vector<vector<ll> > adjList(N);
	for (ll i = 0; i < M; i++) {
		adjList[p[i]].push_back(q[i]);
		adjList[q[i]].push_back(p[i]);
	}

	// first, create an arbitrary subset B that is connected

	set<ll> B;

	queue<ll> bfs;
	bfs.push(0);
	B.insert(0);

	while (!bfs.empty() && B.size() < b) {

		ll u = bfs.front();
		bfs.pop();

		bool alreadyHasB = false;

		for (auto &v: adjList[u]) {
			if (B.find(v) == B.end()) {
				bfs.push(v);
				B.insert(v);
				if (B.size() == b) {
					alreadyHasB = true;
					break;
				}
			}
		}

		if (alreadyHasB) break;

	}

	vector<ll> response(N, 0);
	for (auto &l: B) {
		response[l] = 2;
	}

	// make an arbitrary A, then an arbitrary C

	bool flag = false;
	for (ll i = 0; i < N; i++) {
		if (response[i] == 0 && !flag) {
			response[i] = 1;
			flag = true;
		} else {
			response[i] = 3;
		}
	}

	return response;

}
#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...