#include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>
using namespace std;
typedef long long llong;
const int MAXN = 2e5 + 10;
int n, m;
pair < int, int > ord[MAXN];
int c[MAXN];
vector < int > adj[MAXN];
int leader[MAXN];
int sz[MAXN];
llong sum[MAXN];
vector < int > nodes[MAXN];
bool ans[MAXN];
int findLeader(int u)
{
return leader[u] == u ? u : leader[u] = findLeader(leader[u]);
}
bool connected(int u, int v)
{
return findLeader(u) == findLeader(v);
}
void unite(int u, int v)
{
if(connected(u, v))
return;
u = findLeader(u);
v = findLeader(v);
if(sz[u] < sz[v])
swap(u, v);
sz[u] += sz[v];
leader[v] = u;
sum[u] += sum[v];
for(int &node : nodes[v])
{
nodes[u].push_back(node);
}
nodes[v].clear();
}
void read()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> c[i];
}
for(int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
}
void solve()
{
for(int i = 1; i <= n; i++)
{
ord[i] = {c[i], i};
}
for(int i = 1; i <= n; i++)
{
ans[i] = true;
}
for(int i = 1; i <= n; i++)
{
leader[i] = i;
sz[i] = 1;
sum[i] = c[i];
nodes[i].push_back(i);
}
sort(ord + 1, ord + n + 1);
for(int i = 1; i <= n; i++)
{
int u = ord[i].second;
for(int v : adj[u])
{
if(connected(u, v) || sum[findLeader(u)] < c[v])
continue;
if(sum[findLeader(v)] < c[u])
{
for(int &node : nodes[findLeader(v)])
{
ans[node] = false;
}
}
unite(u, v);
}
}
for(int i = 1; i <= n; i++)
{
cout << ans[i];
}
cout << endl;
}
int main()
{
read();
solve();
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... |