이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "keys.h"
using namespace std;
const int maxn = 3e5 + 10;
struct component
{
map < int, vector < int > > edges;
set < int > keys;
vector < int > vertices;
int parent, cnt_ver;
int index;
};
component cp[maxn];
int n, ver_index[maxn];
vector < pair < int, int > > graph[maxn];
vector < int > ans;
int lead[maxn];
void merge_components(int v, int u)
{
int cnt_edges_v = 0, cnt_edges_u = 0;
for (int key : cp[v].keys)
cnt_edges_v += cp[v].edges[key].size();
for (int key : cp[u].keys)
cnt_edges_u += cp[u].edges[key].size();
if (cp[u].keys.size() < cp[v].keys.size())
swap(cp[u].keys, cp[v].keys);
for (int key : cp[v].keys)
cp[u].keys.insert(key);
if (cnt_edges_v > cnt_edges_u)
swap(cp[v].edges, cp[u].edges);
for (int key : cp[u].keys)
for (int v : cp[v].edges[key])
cp[u].edges[key].push_back(v);
if (cp[v].vertices > cp[u].vertices)
swap(cp[v].vertices, cp[u].vertices);
for (int vertex : cp[v].vertices)
cp[u].vertices.push_back(vertex);
lead[v] = u;
}
int find_leader(int v)
{
if (v == lead[v])
return v;
return (lead[v] = find_leader(lead[v]));
}
vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c)
{
n = r.size();
ans.resize(n);
for (int i = 0; i < u.size(); i ++)
{
graph[u[i]].push_back({v[i], c[i]});
graph[v[i]].push_back({u[i], c[i]});
}
queue < int > q;
for (int i = 0; i < n; i ++)
{
lead[i] = i;
cp[i].keys.insert(r[i]);
for (pair < int, int > nb : graph[i])
cp[i].edges[nb.second].push_back(nb.first);
cp[i].parent = -1;
cp[i].cnt_ver = 1;
cp[i].vertices.push_back(i);
cp[i].index = i;
ver_index[i] = i;
q.push(i);
}
while(!q.empty())
{
int cur = q.front();
q.pop();
for (int key : cp[cur].keys)
{
if (cp[cur].edges[key].empty())
continue;
int to = find_leader(cp[cur].edges[key].back());
cp[cur].edges[key].pop_back();
int up = to;
while(cp[up].parent != -1)
up = cp[up].parent;
if (up != cur)
{
cp[cur].parent = to;
break;
}
while(to != cur)
{
int to_go = cp[to].parent;
merge_components(to, to_go);
to = to_go;
}
q.push(cur);
break;
}
}
int least = n + 1;
for (int i = 0; i < n; i ++)
{
int v = find_leader(i);
if (cp[v].parent != -1)
continue;
least = min(least, (int)cp[v].vertices.size());
}
for (int i = 0; i < n; i ++)
{
int v = find_leader(i);
if (cp[v].parent != -1)
continue;
if (cp[v].vertices.size() != least)
continue;
for (int vertex : cp[v].vertices)
ans[vertex] = 1;
}
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:67:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
67 | for (int i = 0; i < u.size(); i ++)
| ~~^~~~~~~~~~
keys.cpp:134:35: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
134 | if (cp[v].vertices.size() != least)
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
# | 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... |