이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/**
____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|
**/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N_MAX = 200000;
int N, M;
int weight[N_MAX + 2];
vector <int> adj[N_MAX + 2];
int order[N_MAX + 2];
int root[N_MAX + 2];
ll sum[N_MAX + 2];
int findRoot (int u) {
return (root[u] == 0 ? u : root[u] = findRoot(root[u]));
}
bool seen[N_MAX + 2];
vector <int> sons[N_MAX + 2];
bool answer[N_MAX + 2];
void dfs (int u, int parent = 0) {
answer[u] = true;
for (int v : sons[u]) {
if (v != parent) {
dfs(v, u);
}
}
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
for (int u = 1; u <= N; u++) {
cin >> weight[u];
}
for (int i = 1; i <= M; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
iota(order + 1, order + N + 1, 1);
sort(order + 1, order + N + 1, [&] (const int &u, const int &v) {
return weight[u] < weight[v];
});
copy(weight + 1, weight + N + 1, sum + 1);
for (int i = 1; i <= N; i++) {
int u = order[i];
seen[u] = true;
for (int v : adj[u]) {
if (seen[v] == true) {
v = findRoot(v);
if (v != u) {
if (sum[v] >= weight[u]) {
sons[u].push_back(v);
}
root[v] = u;
sum[u] += sum[v];
}
}
}
}
dfs(order[N]);
for (int u = 1; u <= N; u++) {
cout << answer[u];
}
cout << "\n";
return 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... |