이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 = 4000;
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 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... |