Submission #732232

#TimeUsernameProblemLanguageResultExecution timeMemory
73223242kangarooStranded Far From Home (BOI22_island)C++17
100 / 100
222 ms30300 KiB
//
// Created by 42kangaroo on 16/04/2023.
//
#include "bits/stdc++.h"

using namespace std;

#define int long long

using g_t = vector<vector<int>>;

int find(int a, vector<int>& p, vector<bool>& pos) {
	if (a == p[a]) return a;
	int par = find(p[a], p, pos);
	if (!pos[p[a]]) pos[a] = false;
	return p[a] = par;
}

void unite(int a, int b, vector<int>& p, vector<int>& s, vector<bool>& pos) {
	a = find(a, p, pos);
	b = find(b, p, pos);
	if (a == b) return;
	p[b] = a;
	s[a] += s[b];
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, m;
	cin >> n>> m;
	vector<int> s(n);
	for (int i = 0; i < n; ++i) {
		cin >> s[i];
	}
	g_t gr(n);
	for (int i = 0; i < m; ++i) {
		int a, b;
		cin>> a >> b;
		--a;--b;
		gr[a].push_back(b);
		gr[b].push_back(a);
	}
	vector<int> ns = s;
	vector<int> o(n);
	std::iota(o.begin(), o.end(),0);
	std::sort(o.begin(), o.end(),[&](int l, int r){return s[l] < s[r];});
	vector<int> p(n);
	std::iota(p.begin(), p.end(),0);
	vector<bool> pos(n, true);
	for (int i = 0; i < n; ++i) {
		for (auto e: gr[o[i]]) {
			if (s[e] > s[o[i]]) continue;
			if (ns[find(e, p, pos)] < s[o[i]]) pos[find(e, p, pos)] = false;
			unite(o[i], e, p, ns, pos);
		}
	}
	for (int i = 0; i < n; ++i) {
		find(i, p, pos);
		cout << pos[i];
	}
	cout << "\n";

}
#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...