#include<bits/stdc++.h>
#define ll long long
#define ldb long double
#define db double
#define fi first
#define se second
#define sza(a) (int)a.size()
#define pir pair<int,int>
#define pirll pair<ll,ll>
using namespace std;
const int maxn = 2e5 + 5;
template <class t1,class t2> inline void maxi(t1 &x,t2 y){if (x < y) x = y;}
template <class t1,class t2> inline void mini(t1 &x,t2 y){if (x > y) x = y;}
template <class t1> void simplify(t1 &x){
sort(x.begin(),x.end());
x.erase(unique(x.begin(),x.end()),x.end());
}
int a[maxn];
vector <int> vec[maxn];
void input(int n,int m){
for (int i = 1 ; i <= n ; i++) cin >> a[i];
while (m--){
int u,v;
cin >> u >> v;
vec[u].push_back(v);
vec[v].push_back(u);
}
}
namespace subtask1{
bool subtask1(int n,int m){
return max(n,m) <= 2000;
}
bool mark[maxn];
set <pir> s;
void refresh(int n){
s.clear();
for (int i = 1 ; i <= n ; i++) mark[i] = 0;
}
bool check(int source,int n){
//starting from source
refresh(n);
ll sum = 0;
s.insert({0,source});
while (s.size()){
pir t = *s.begin();
s.erase(t);
int u = t.se;
if (mark[u] || t.fi > sum) continue;
mark[u] = 1;
sum += a[u];
for (int v : vec[u])
if (!mark[v])
s.insert({a[v],v});
}
return all_of(mark + 1,mark + 1 + n,[](bool x){return x;});
}
void solve(int n,int m){
for (int i = 1 ; i <= n ; i++)
cout << check(i,n);
}
}
namespace subfull{
struct dsu{
int id[maxn];
ll sum[maxn];
vector <int> lst[maxn];
void init(int n){
for (int i = 1 ; i <= n ; i++)
id[i] = i,lst[i].push_back(i),sum[i] = a[i];
}
int fid(int x){
return (x == id[x]) ? x : id[x] = fid(id[x]);
}
//small to large, n log n
void add(int u,int v){
int x = fid(u),y = fid(v);
if (x == y) return;
if (lst[x].size() < lst[y].size()) swap(x,y);
id[y] = x;
sum[x] += sum[y];
for (int t : lst[y]) lst[x].push_back(t);
}
inline ll getsum(int x){
return sum[fid(x)];
}
inline void purge(int x){
lst[fid(x)].clear();
}
} dsu;
vector <pir> traverse_order;
bool res[maxn],mark[maxn];
void generate_traverse_order(int n){
for (int i = 1 ; i <= n ; i++)
traverse_order.push_back({a[i],i});
sort(traverse_order.begin(),traverse_order.end());
}
void add_to_island(int u){
vector <int> components;
for (int v : vec[u])
if (mark[v])
components.push_back(dsu.fid(v));
simplify(components);
for (int comp : components)
if (dsu.getsum(comp) < a[u])
dsu.purge(comp);
for (int comp : components)
dsu.add(comp,u);
}
void solve(int n){
for (pir t : traverse_order){
int u = t.se;
add_to_island(u);
mark[u] = 1;
}
}
void prepare_answer(int n){
for (int i = 2 ; i <= n ; i++)
if (dsu.fid(i) != dsu.fid(i - 1)) return;
for (int x : dsu.lst[dsu.fid(1)])
res[x] = 1;
}
void solve(int n,int m){
dsu.init(n);
generate_traverse_order(n);
solve(n);
prepare_answer(n);
for (int u = 1 ; u <= n ; u++) cout << res[u];
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//// freopen("ISLAND.inp","r",stdin);
//// freopen("ISLAND.out","w",stdout);
int n,m;
cin >> n >> m;
input(n,m);
if (subtask1::subtask1(n,m)){
subtask1::solve(n,m);
return 0;
}
subfull::solve(n,m);
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... |