#include <bits/stdc++.h>
using namespace std;
#define int long long
struct DSU{
vector<int> pr;
vector<int> sz;
vector<int> sum;
vector<vector<int>> members;
vector<bool> possible;
DSU(int n, vector<array<int, 2>>& s){
pr.resize(n+1);
sz.resize(n+1);
sum.resize(n+1);
members.resize(n+1);
possible.resize(n+1);
for (int i = 1; i <= n; ++i){
pr[i] = i;
sz[i] = 1;
sum[i] = s[i][0];
members[i].push_back(i);
possible[i] = true;
}
}
// u is the node with next greater weight
void Union(int u, int v, int val_u){
int cu = pr[u], cv = pr[v];
if (cu == cv) return;
if (sum[cv] < val_u){
// cv component ties cannot be preferred
for (auto node : members[cv])
possible[node] = false;
}
if (sz[cu] > sz[cv]) swap(cu, cv);
sum[cv] += sum[cu];
sz[cv] += sz[cu];
for (auto node : members[cu]){
pr[node] = cv;
members[cv].push_back(node);
}
}
string get_answer(){
string ans;
for (int i = 1; i < possible.size(); ++i){
if (possible[i]) ans += '1';
else ans += '0';
}
return ans;
}
};
signed main() {
int n, m; cin >> n >> m;
vector<array<int, 2>> s(n+1); s[0][0] = INT32_MIN;
for (int i = 1; i <= n; ++i) {
cin >> s[i][0];
s[i][1] = i;
}
vector<vector<int>> ed(n+1);
for (int i = 0; i < m; ++i){
int u, v; cin >> u >> v;
ed[u].push_back(v);
ed[v].push_back(u);
}
DSU dsu(n, s);
sort(s.begin(), s.end());
vector<bool> in(n+1);
for (int i = 1; i <= n; ++i){
in[s[i][1]] = true;
for (auto to : ed[s[i][1]]){
if (!in[to]) continue;
dsu.Union(s[i][1], to, s[i][0]);
}
}
cout << dsu.get_answer() << "\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... |