제출 #1351366

#제출 시각아이디문제언어결과실행 시간메모리
1351366vahagngSplit the Attractions (IOI19_split)C++20
0 / 100
527 ms1114112 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;

vector<int>adj[N];
int col[N], c[3], val[3], lst = 0;
bool visited[N];
int deg[N], sz[N], root = -1, A, B;

void dfs(int node, int parent){
	sz[node] = 1;
	for(auto i : adj[node]){
		if(i == parent) continue;
		dfs(i, node);
		sz[node] += sz[i];
	}
}

bool can_split(int node, int parent){
	vector<int> v;
	for(auto i : adj[node]){
		v.push_back(sz[i]);
	}
	if(v.size() > 1){
		sort(v.rbegin(), v.rend());
		int K = 0;
		for(auto i : v){
			if(sz[i] >= A){
				K = sz[i];
			}else{
				break;
			}
		}
		if(K != 0 && sz[node] - K >= B){
			root = node;
			return 1;
		}
	}
	for(auto i : adj[node]){
		if(i == parent) continue;
		int P = sz[i];
		sz[i] = sz[node];
		sz[node] = sz[node] - P;
		if(can_split(i, node)){
			return 1;
		}
		sz[node] += P;
		sz[i] = P;
	}
	return 0;
}

void dfs_col(int node, int parent, int comp){
	if(c[comp] == val[comp]) return;
	c[comp]++;
	col[node] = comp + 1;
	visited[node] = 1;
	for(auto i : adj[node]){
		if(i == parent || visited[i]) continue;
		dfs_col(i, node, comp);
	}
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<int> res;
	for(int i = 0; i < p.size(); i++){
		adj[p[i]].push_back(q[i]);
		adj[q[i]].push_back(p[i]);
		deg[p[i]]++;
		deg[q[i]]++;
	}
	vector<pair<int, int>>o;
	o.push_back({a, 0});
	o.push_back({b, 1});
	o.push_back({c, 2});
	sort(o.begin(), o.end());
	A = o[0].first;
	B = o[1].first;
	val[0] = a;
	val[1] = b;
	val[2] = c;
	dfs(0, 0);
	if(!can_split(0, 0)){
		for(int i = 0; i < n; i++){
			res.push_back(0);
		}
		return res;
	}
	dfs(root, -1);
	vector<pair<int, int>> v;
	for(auto i : adj[root]){
		v.push_back({sz[i], i});
	}
	sort(v.rbegin(), v.rend());
	int pr = -1;
	for(auto i : v){
		if(i.first >= A){
			pr = i.second;
		}
	}
	dfs_col(pr, root, o[0].second);
	dfs_col(root, -1, o[1].second);
	for(int i = 0; i < n; i++){
		if(!col[i]){
			col[i] = o[2].second + 1;
		}
	}
	for(int i = 0; i < n; i++){
		res.push_back(col[i]);
	}
	return res;
}
#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...