Submission #967636

#TimeUsernameProblemLanguageResultExecution timeMemory
967636dong_gasStranded Far From Home (BOI22_island)C++17
100 / 100
136 ms30396 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/extc++.h>
#define all(v) v.begin(), v.end()
#define zip(v) sort(all(v)), v.erase(unique(all(v)), v.end())
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pint;
typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
 
int n, m, a[200020];
vector<int> adj[200020], can[200020];
bool visited[200020];
vector<tuple<int,int,int>> edges;
 
struct disjoin_set{
	int papa[200020], sz[200020];
	ll sum[200020];
	void init() {
		for(int i=1;i<=n;i++) sum[i]=a[i], sz[i]=1, papa[i]=-1, can[i].emplace_back(i);
	}
	int Find(int u) {
		if(papa[u]==-1) return u;
		return papa[u]=Find(papa[u]);
	}
	bool Union(int u,int v) {
		u=Find(u), v=Find(v);
		if(u==v) return false;
		if(sz[u]<sz[v]) swap(u,v);
		papa[v]=u;
		sz[u]+=sz[v];
		sum[u]+=sum[v];
		for(auto x: can[v]) can[u].emplace_back(x);
		return true;
	}
} djs;

 
void solve() {
    cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	while(m --> 0) {
		int u, v; cin>>u>>v;
		if(a[u]<a[v]) swap(u,v);
		edges.push_back({a[u],u,v});
	}
	sort(all(edges));
	djs.init();
	for(auto& [_, u, v]: edges) {
		if(djs.sum[djs.Find(v)]<a[u]) can[djs.Find(v)].clear();
		djs.Union(u,v);
	}
	for(int& x: can[djs.Find(1)]) visited[x]=1;
	for(int i=1;i<=n;i++) cout<<visited[i];	
}
 
int main() {
    cin.tie(0)->sync_with_stdio(0);
    int tc=1; //cin>>tc;
    while(tc--) solve();
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...