Submission #1130462

#TimeUsernameProblemLanguageResultExecution timeMemory
1130462AcanikolicStranded Far From Home (BOI22_island)C++20
100 / 100
165 ms33624 KiB
#include <bits/stdc++.h>

#define int long long

#define pb push_back
 
#define F first
 
#define S second
 
using namespace std;
 
const int N = 2e5 + 10;

const int mod = 1e9 + 7;

const int inf = 2e18;
 
vector<int>g[N]; 
vector<array<int,3>>edges;
int par[N],mx[N],sum[N],ans[N];

int get(int x) {
	return (x == par[x] ? x : par[x] = get(par[x]));
}

void unite(int u,int v) {
	u = get(u);
	v = get(v);
	if(u == v) return;
	if(sum[u] < mx[v]) g[u].clear();
	if(sum[v] < mx[u]) g[v].clear();
	if(g[u].size() > g[v].size()) swap(u,v);
	for(int j : g[u]) g[v].pb(j);
	g[u].clear();
	par[u] = v;
	sum[v] += sum[u];
	mx[v] = max(mx[v],mx[u]);	
}
 
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

 	int n,m;
 	cin >> n >> m;
 	vector<int>a(n + 1);
 	for(int i = 1; i <= n; i++) cin >> a[i];
 	for(int i = 1; i <= m; i++) {
 		int u,v;
 		cin >> u >> v;
 		edges.pb({max(a[u],a[v]),u,v});
 	}
 	sort(edges.begin(),edges.end());
 	for(int i = 1; i <= n; i++) {
 		g[i] = {i};
 		par[i] = i;
 		sum[i] = a[i];
 		mx[i] = a[i];
 	}
 	for(auto X : edges) unite(X[1],X[2]);
 	for(int j : g[get(1)]) ans[j] = 1;
 	for(int i = 1; i <= n; i++) cout << ans[i];
    return 0;
}
#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...