This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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] >= a && n - s[i] >= b)
{
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |