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>
#include <utility>
using ll = long long;
using namespace std;
#define F0R(i, n) for (ll i= 0; i < n;i++)
template<typename T>
using V = vector<T>;
using vi = V<ll>;
using vvi = V<vi>;
#define pb push_back
using pi = pair<ll, ll>;
#define all(x) begin(x), end(x)
#define f first
#define s second
V<ll> initSum;
struct dsu {
vi par, absPar;
vi siz;
vi sum;
dsu(ll n, vi initSum) {
par.resize(n, -1);
absPar.resize(n, -1);
siz.resize(n, 1);
sum = std::move(initSum);
}
ll get(ll x) {
if (absPar[x] == -1) return x;
return absPar[x] = get(absPar[x]);
}
void combine(ll a, ll b) {
a = get(a), b = get(b);
if (a == b) return;
if (initSum[b] > initSum[a]) swap(a,b);
siz[a] += siz[b];
sum[a] += sum[b];
par[b] = a;
absPar[b] = a;
}
};
//TODO CHECK CONNECTIVITY
vvi genGraph(vi par) {
vvi g(par.size());
F0R(i, par.size()) {
if (par[i] == -1) continue;
g[par[i]].pb(i);
g[i].pb(par[i]);
}
return g;
}
V<bool> possible;
dsu* dsu;
vvi g;
void dfsPos(ll x, ll p) {
if (p == -1 || dsu->sum[x] >= initSum[p]) possible[x] = true;
else return;
for (auto child : g[x]) {
if (child == p) continue;
dfsPos(child, x);
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
ll n, m; cin >> n >> m;
V<pair<ll, pi>> edges;
initSum.resize(n + 1);
F0R(i, n)
cin >> initSum[i + 1];
F0R(i, m) {
ll a, b; cin >> a>> b;
edges.pb({max(initSum[a], initSum[b]), {a, b}});
}
sort(all(edges));
dsu = new struct dsu(n + 1, initSum);
for (auto [x,pa] : edges) {
auto [a,b] = pa;
dsu->combine(a,b);
}
g = genGraph(dsu->par);
ll root = dsu->get(1);
bool pos = true;
F0R(i, n)
if (dsu->get(i + 1) != root) pos = false;
possible.resize(n + 1);
if (pos) dfsPos(root, -1);
F0R(i, n) {
cout << possible[i + 1] << "";
}
return 0;
}
Compilation message (stderr)
island.cpp: In function 'vvi genGraph(vi)':
island.cpp:7:35: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int, std::allocator<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
7 | #define F0R(i, n) for (ll i= 0; i < n;i++)
......
53 | F0R(i, par.size()) {
| ~~~~~~~~~~~~~
island.cpp:53:5: note: in expansion of macro 'F0R'
53 | F0R(i, par.size()) {
| ^~~
# | 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... |