제출 #723183

#제출 시각아이디문제언어결과실행 시간메모리
723183LittleCubeSplit the Attractions (IOI19_split)C++17
22 / 100
529 ms1048576 KiB
#include "split.h"
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;

int N, M, dsu[100000], rk[100000], pre[100000], vis[100000], s[100000];
vector<pii> sz;
vector<int> sol;
vector<int> E[100000];

void dfs(int u)
{
	s[u] = 1;
	for (auto v : E[u])
		if (v != pre[u])
		{
			pre[v] = u;
			dfs(v);
			s[u] += s[v];
		}
}

void construct(int u, int &cnt, int color)
{
	if(cnt > 0)
		cnt--, sol[u] = color;
	for (auto v : E[u])
		if (!vis[v])
		{
			vis[v] = 1;
			construct(v, cnt, color);
		}
}

mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q)
{
	N = n, M = p.size();
	sz.emplace_back(pii(a, 1));
	sz.emplace_back(pii(b, 2));
	sz.emplace_back(pii(c, 3));
	sort(sz.begin(), sz.end());
	a = sz[0].F, b = sz[1].F;
	for (int i = 0; i < M; i++)
		E[p[i]].emplace_back(q[i]), E[q[i]].emplace_back(p[i]);
	dfs(0);
	sol = vector<int>(N, sz[2].S);
	for (int i = 1; i < N; i++)
	{
		if (s[i] >= a && n - s[i] >= b)
		{
			vis[i] = vis[pre[i]] = 1;
			construct(i, a, sz[0].S);
			construct(pre[i], b, sz[1].S);
			return sol;
		}
		else if (s[i] >= b && n - s[i] >= a)
		{
			vis[i] = vis[pre[i]] = 1;
			construct(i, b, sz[1].S);
			construct(pre[i], a, sz[0].S);
			return sol;
		}
	}
	return vector<int>(N, 0);
}
#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...