Submission #723192

#TimeUsernameProblemLanguageResultExecution timeMemory
723192LittleCubeSplit the Attractions (IOI19_split)C++14
40 / 100
302 ms24532 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], F[100000];

int find(int k)
{
	return k == dsu[k] ? k : dsu[k] = find(dsu[k]);
}

void merge(int x, int y)
{
	rk[x] += rk[y];
	dsu[y] = x;
}

void dfs(int u)
{
	s[u] = 1;
	for (auto v : F[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 : F[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;
	vector<int> order;
	for (int i = 0; i < M; i++)
		E[p[i]].emplace_back(q[i]), E[q[i]].emplace_back(p[i]), order.emplace_back(i);
	sol = vector<int>(N, sz[2].S);

	int t = 10;
	while (t--)
	{
		for (int i = 0; i < N; i++)
		{
			dsu[i] = i, rk[i] = 1;
			F[i].clear();
		}
		shuffle(order.begin(), order.end(), rd);
		for (int i : order)
		{
			int u = find(p[i]), v = find(q[i]);
			if (u == v)
				continue;
			merge(u, v);
			F[p[i]].emplace_back(q[i]);
			F[q[i]].emplace_back(p[i]);
		}

		dfs(0);
		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...