제출 #1344206

#제출 시각아이디문제언어결과실행 시간메모리
1344206jellybeanStranded Far From Home (BOI22_island)C++20
0 / 100
137 ms27916 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], lastupd[N], sum[N], dead[N];
vector<int>weights;
vector<int>adj[N];
int n;

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

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

int fs(int x){
	if(p[x] == x) return x;
	return p[x] = fs(p[x]);
}

void merge(int u, int v){
	int gu = fs(u), gv = fs(v);
	if(gu == gv) return;
	
	int curupd = a[u];
	if(lastupd[gv] != curupd){
		int id = lower_bound(weights.begin(), weights.end(), lastupd[gv]) - weights.begin();
		id++;
		if(sum[gv] < weights[id]) dead[gv] = 1;
	}
	adj[gv].pb(gu); adj[gu].pb(gv);
	p[gv] = gu;
	sum[gu] += sum[gv];
}

void dfs(int x, int p){
	for(auto i: adj[x]){
		if(i == p) continue;
		if(dead[x]) dead[i] = 1;
		dfs(i,x);
	}
}

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=0; i<m; i++){
		int w = edges[i].w;
		if(i == 0 or weights.back() != w){
			weights.pb(w);
		}
	}
	
	for(int i=1; i<=n; i++){
		p[i] = i, sum[i] = a[i], lastupd[i] = a[i];
	}
	
	for(int i=0; i<m; i++){
		auto[u,v,w] = edges[i];
		merge(u,v);
	}
	
	dfs(edges[m-1].u,-1);
	
	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...