Submission #422724

#TimeUsernameProblemLanguageResultExecution timeMemory
422724MeGustaElArroz23Split the Attractions (IOI19_split)C++14
18 / 100
125 ms15984 KiB
#include "split.h"
#include <cstdio>
#include <cassert>

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<bool,bool> pbb;
typedef vector<pbb> vbb;
typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef vector<bool> vb;

const ll INF=1000000001;

vi solve1(int n, int a, int b, int c, vvi conexiones){
	vi res(n,0);
	queue<int> cola;
	cola.push(0);
	vb porvisitar(n,true);
	while (cola.size()){
		int x=cola.front();
		cola.pop();
		if (porvisitar[x]){
			porvisitar[x]=false;
			if (b){
				res[x]=2;
				b--;
			}
			else if (c){
				res[x]=3;
				c--;
			}
			else res[x]=1;

			for (int y:conexiones[x]) cola.push(y);
		}
	}
	return res;
}

vi solve2(int n, int a, int b, int c, vvi conexiones){
	int inicio=0;
	for (int i=0;i<n;i++){
		if (conexiones[i].size()==0) inicio=i;
	}
	vi res(n,0);
	stack<int> cola;
	cola.push(inicio);
	vb porvisitar(n,true);
	while (cola.size()){
		int x=cola.top();
		cola.pop();
		if (porvisitar[x]){
			porvisitar[x]=false;
			if (b){
				res[x]=2;
				b--;
			}
			else if (c){
				res[x]=3;
				c--;
			}
			else res[x]=1;

			for (int y:conexiones[x]) cola.push(y);
		}
	}
	return res;
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<int> res;
	vvi conexiones(n);
	int m=p.size();
	for (int i=0;i<m;i++){
		conexiones[p[i]].push_back(q[i]);
		conexiones[q[i]].push_back(p[i]);
	}
	if (a==1) return solve1(n,a,b,c,conexiones);
	else return  solve2(n,a,b,c,conexiones);
}
#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...