제출 #1344358

#제출 시각아이디문제언어결과실행 시간메모리
1344358jellybeanStranded Far From Home (BOI22_island)C++20
100 / 100
86 ms11796 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define dd(x) cout<<#x<<" is "<<x<<endl;
#define dd2(x,y) cout<<#x<<" is "<<x<<" "<<#y<<" is "<<y<<endl;
typedef pair<int,int> pii;

const int N = 2e5+5;
int a[N], p[N], sum[N], dead[N];
int n;

struct edge{
	int u,v,w;
};

bool cmp(edge a, edge b){
	return a.w < b.w;
}

pii fs(int x){
	if(p[x] == x) {
		if(dead[x]) return {x,1};
		else return {x,0};
	}
	auto[a,b] = fs(p[x]);
	p[x] = a;
	if(b) dead[x] = 1;
	return {a, dead[x]};
}

void merge(int u, int v){
	int gu = fs(u).first, gv = fs(v).first;
	if(gu == gv) return;
	
	if(sum[gv] < a[u]) dead[gv] = 1;
	p[gv] = gu;
	sum[gu] += sum[gv];
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int m; cin>>n>>m;
	for(int i=1; i<=n; i++) cin>>a[i];
	
	if(n == 1){
		cout<<1;
		return 0;
	}
	
	edge edges[m];
	for(int i=0; i<m; i++){
		int u,v; cin>>u>>v;
		if(a[u] < a[v]) swap(u,v); //a[u] is larger
		edges[i] = {u,v,a[u]};
	}
	
	sort(edges, edges+m, cmp);
	
	for(int i=1; i<=n; i++){
		p[i] = i, sum[i] = a[i];
	}
	
	for(int i=0; i<m; i++){
		auto[u,v,w] = edges[i];
		merge(u,v);
	}
	
	for(int i=1; i<=n; i++) fs(i);
	
	for(int i=1; i<=n; i++) cout << ((dead[i]) ? 0 : 1);
	
	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...