Submission #1017827

#TimeUsernameProblemLanguageResultExecution timeMemory
1017827ZeroCoolStranded Far From Home (BOI22_island)C++14
100 / 100
178 ms16472 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

#define pb push_back
#define mp make_pair
#define mt make_tuple
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()

using ll = long long;
using ld = long double;
 
void solve(int T);
void pre();
 
const int N = 2e5 + 10;
const int M = 405;
const int SQRT = 500;
const int LOG = 20;
const int INF = 1e18;
const int MOD = 1e9+7;
const ld EPS = 1e-9;

void pre(){
	#ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);
    cin.tie(0);
	#endif
	
}

int32_t main(){
	pre();
	int tt = 1;
	//cin>>tt;
	for(int i = 1;i<=tt;i++){
		//cerr<<"Case "<<i<<": "<<endl;
		solve(i);
	}
    return 0;
}



struct Edge{
	int u,v,w;
	
};
bool operator<(Edge a,Edge b){
	return a.w < b.w;
}

bool bad[N];

int A[N];
int sum[N];

int p[N];

int find(int u){
	if(p[u] == u)return u;
	int v = find(p[u]);
	bad[u] |= bad[p[u]];
	p[u] = v;
	return v;
}

void join(int u,int v){
	u = find(u);
	v = find(v);

	if(u == v)return;
	if(A[u] < A[v])swap(u,v);
	if(A[u] > sum[v])bad[v] = true;
	p[v] = u;
	sum[u] += sum[v];
}

void solve(int T){
    int n,m;
	cin>>n>>m;
	for(int i = 1;i<=n;i++){
		cin>>A[i];
		p[i] = i;
		sum[i] = A[i];
	}
	Edge edge[m];
	for(int i = 0;i<m;i++){
		int u,v;
		cin>>u>>v;
		edge[i] = {u, v, max(A[u], A[v])}; 
	}
	sort(edge, edge + m);

	for(auto p : edge){
		join(p.u, p.v);
	}
	cerr<<"kur"<<endl;


	for(int i = 1;i<=n;i++){
		find(i);
		cout<<!bad[i];
	}
	cout<<endl;
}
#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...