Submission #1317087

#TimeUsernameProblemLanguageResultExecution timeMemory
1317087PlayVoltzSplit the Attractions (IOI19_split)C++20
7 / 100
2094 ms15640 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second

int n;
bool found=0;
vector<int> ans, cc, ooga;
vector<bool> visited;
vector<pii> vect;
vector<vector<int> > graph;

void label(int node, int p, int t){
	if (visited[node])return;
	if (cc[t]>=vect[t].fi)return;
	++cc[t];
	ans[node]=vect[t].se;
	for (auto num:graph[node])if (num!=p)label(num, node, t);
}

int dfscount(int node){
	if (visited[node])return 0;
	visited[node]=1;
	ooga.pb(node);
	int res=1;
	for (auto num:graph[node])if (!visited[num])res+=dfscount(num);
	return res;
}

bool bfs(int start){
	stack<int> q;
	ans.assign(n, 0);
	int cc=0;
	q.push(start);
	visited.assign(n, 0);
	vector<bool> done(n, 0);
	while (q.size()&&cc<vect[0].fi){
		int node=q.top();
		q.pop();
		if (ans[node])continue;
		done[node]=1;
		visited[node]=1;
		ans[node]=vect[0].se;
		++cc;
		for (auto num:graph[node])if (!visited[num])q.push(num);
	}
	if (cc<vect[0].fi)return 0;
	bool can=0;
	for (int i=0; i<n; ++i){
		ooga.clear();
		if (!done[i]&&!ans[i]&&dfscount(i)>=vect[1].fi){
			for (auto a:ooga)done[a]=1, visited[a]=0;
			label(i, -1, 1), can=1;
			break;
		}
		for (auto a:ooga)done[a]=1, visited[a]=0;
	}
	for (int i=0; i<n; ++i)if (!ans[i])ans[i]=vect[2].se;
	return can;
}

vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q){
	n=N;
	cc.resize(4, 0);
	vect.pb(mp(a, 1));
	vect.pb(mp(b, 2));
	vect.pb(mp(c, 3));
	sort(vect.begin(), vect.end());
	ans.resize(n, 0);
	graph.resize(n);
	visited.resize(n, 0);
	for (int i=0; i<p.size(); ++i){
		graph[p[i]].pb(q[i]);
		graph[q[i]].pb(p[i]);
	}
	for (int i=0; i<n; ++i)if (bfs(i))return ans;
	vector<int> temp(n, 0);
	return temp;
}
#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...