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;
typedef long long ll;
#define all(x) (x).begin(), (x).end()
#define MP make_pair
const int N = 200500;
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
int n;
int s[N];
bool can[N];
struct dsu{
vector<int> p;
vector<long long> sum;
dsu(){
p.resize(n);
iota(all(p), 0);
sum.resize(n);
for (int i = 0; i < n; i++) sum[i] = s[i];
}
int leader(int x){
return (x == p[x] ? x : p[x] = leader(p[x]));
}
bool unite(int x, int y){
int px = leader(x);
int py = leader(y);
if (px == py) return false;
if (sum[px] < s[y]){
for (int i = 0; i < n; i++){
if (leader(i) == px) can[i] = false;
}
}
if (sum[py] < s[x]){
for (int i = 0; i < n; i++){
if (leader(i) == py) can[i] = false;
}
}
sum[py] += sum[px];
p[px] = py;
return true;
}
};
vector<int> g[N];
void solve(){
int m;
cin >> n >> m;
for (int i = 0; i < n; i++){
cin >> s[i];
}
vector<pair<int, int>> edges;
while (m--){
int u, v;
cin >> u >> v;
--u, --v;
g[u].push_back(v);
g[v].push_back(u);
if (s[u] > s[v]) swap(u, v);
edges.emplace_back(u, v);
}
sort(all(edges), [](auto x, auto y){
return s[x.second] < s[y.second];
});
fill(can, can + n, true);
dsu d;
for (auto [u, v] : edges){
d.unite(u, v);
}
for (int i = 0; i < n; i++){
cout << can[i];
}
}
int main() {
ios_base::sync_with_stdio(false);
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
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... |