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];
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;
}
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)
{
vector<pii> sz;
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> v;
for (int i = 0; i < M; i++)
v.emplace_back(i);
int t = 20;
while (t--)
{
multiset<int, greater<int>> ms;
for (int i = 0; i < N; i++)
{
dsu[i] = i, rk[i] = 1;
ms.insert(1);
}
shuffle(v.begin(), v.end(), rd);
for (int i : v)
{
int u = find(p[i]), v = find(q[i]);
if (u == v)
continue;
ms.erase(ms.find(rk[u])), ms.erase(ms.find(rk[v])), ms.insert(rk[u] + rk[v]);
merge(u, v);
if (ms.size() >= 2 && *ms.begin() >= b && *next(ms.begin()) >= a)
break;
}
if (ms.size() >= 2 && *ms.begin() >= b && *next(ms.begin()) >= a)
{
vector<int> sol(N, sz[2].S);
int ra, rb;
for (int i = 0; i < N; i++)
if(rk[i] >= b && dsu[i] == i)
{
rb = i;
break;
}
for (int i = 0; i < N; i++)
if(rk[i] >= ra && dsu[i] == i && i != rb)
{
ra = i;
break;
}
for (int i = 0; i < N; i++)
{
int j = find(i);
if(j == ra)
sol[i] = sz[0].S;
else if(j == rb)
sol[i] = sz[1].S;
}
return sol;
}
}
return vector<int>(N, 0);
}
Compilation message (stderr)
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:70:5: warning: 'ra' may be used uninitialized in this function [-Wmaybe-uninitialized]
70 | if(rk[i] >= ra && dsu[i] == i && i != rb)
| ^~
split.cpp:80:10: warning: 'rb' may be used uninitialized in this function [-Wmaybe-uninitialized]
80 | else if(j == rb)
| ^~
# | 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... |