Submission #1295659

#TimeUsernameProblemLanguageResultExecution timeMemory
1295659ciao_gioStranded Far From Home (BOI22_island)C++20
100 / 100
219 ms18652 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

struct DSU {
	int n;
	vector<int> l, d;

	vector<ll> s;
	vector<bool> m;

	DSU(int _n) : n(_n), l(n), d(n, 1), s(n, -1), m(n, false) {
		iota(begin(l), end(l), 0);
	}

	int find(int v) {
		if (l[v] == v) 
			return v;

		int p = find(l[v]);

		m[v] = m[v] || m[l[v]];

		return l[v] = p;
	}

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

		if (u == v)
			return;

		l[v] = u;
		d[u] += d[v];
		s[u] += s[v];
	}
};

int main() {
	int N, M;
	cin >> N >> M;

	vector<int> S(N);
	for (int i = 0; i < N; i++) {
		cin >> S[i];
	}

	vector<vector<int>> adj(N);
	for (int i = 0, x, y; i < M; i++) {
		cin >> x >> y; x--; y--;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}

	vector<int> idx(N);
	iota(begin(idx), end(idx), 0);
	sort(begin(idx), end(idx), [&] (int i, int j) { return S[i] < S[j]; });

	DSU dsu(N);

	for (int i = 0; i < N; i++) {
		int v = idx[i];
		dsu.s[v] = S[v];

		for (int u: adj[v]) {
			if (dsu.s[u] == -1) 
				continue;

			int p = dsu.find(u);
			
			if (dsu.s[p] < S[v]) 
				dsu.m[p] = true;

			dsu.merge(u, v);
		}
	}

	for (int i = 0; i < N; i++) {
		dsu.find(i);
		cout << !dsu.m[i];
	}

	cout << '\n';

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