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<bits/stdc++.h>
using namespace std;
mt19937 rnd(51);
#define ll long long
#define pb push_back
#define ld long double
const int N = 2e5 + 10;
ll sum[N];
int par[N];
vector<int> g[N];
set<int> st[N];
int find_set(int v) {
if (v == par[v]) {
return v;
} else {
return par[v] = find_set(par[v]);
}
}
void union_set(int a, int b) {
a = find_set(a);
b = find_set(b);
if (st[a].size() < st[b].size()) {
swap(a, b);
}
for (auto to : st[b]) {
st[a].insert(to);
}
par[b] = a;
sum[a] += sum[b];
}
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif // LOCAL
ios_base::sync_with_stdio(0);
cin.tie(0);
for (int i = 0; i < N; i++) {
par[i] = i;
st[i].insert(i);
}
int n, m;
cin >> n >> m;
vector<int> s(n), good(n, 1);
for (int i = 0; i < n; i++) {
cin >> s[i];
sum[i] = s[i];
}
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
a--, b--;
g[a].pb(b);
g[b].pb(a);
}
vector<int> ord(n);
iota(ord.begin(), ord.end(), 0);
sort(ord.begin(), ord.end(), [&](int i, int j){return s[i] < s[j];});
for (auto v : ord) {
set<int> vert;
for (auto to : g[v]) {
if (s[to] <= s[v] && find_set(to) != find_set(v)) {
vert.insert(find_set(to));
}
}
for (auto to : vert) {
if (sum[to] < s[v]) {
for (auto u : st[to]) {
good[u] = 0;
}
st[to].clear();
}
union_set(to, v);
}
}
for (int i = 0; i < n; i++) {
cout << good[i];
}
cout << endl;
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... |