Submission #583862

#TimeUsernameProblemLanguageResultExecution timeMemory
583862valerikkStranded Far From Home (BOI22_island)C++17
100 / 100
355 ms37560 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>
#include <cmath>
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <iomanip>

using namespace std;

#define all(a) (a).begin(), (a).end()

using ll = long long;
using ld = long double;

const int N = 2e5 + 7;

int n;
int s[N];
vector<int> g[N];
int p[N];
ll sum[N];
vector<int> st[N];
int ans[N];

int get(int v) {
	return p[v] == v ? v : p[v] = get(p[v]);
}

void merge(int v, int u) {
	v = get(v);
	u = get(u);
	if (v == u) return;
	if (sum[v] > sum[u]) swap(v, u);
	p[v] = u;
	sum[u] += sum[v];
	for (int w : st[v]) {
		st[u].push_back(w);
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int m;
	cin >> n >> m;
	for (int i = 0; i < n; ++i) {
		cin >> s[i];
	}
	while (m--) {
		int a, b;
		cin >> a >> b;
		--a;
		--b;
		g[a].push_back(b);
		g[b].push_back(a);
	}	
	for (int i = 0; i < n; ++i) {
		ans[i] = 1;
	}
	vector<pair<int, int>> by_s;
	for (int i = 0; i < n; ++i) {
		by_s.push_back({s[i], i});
	}
	sort(all(by_s));

	for (int i = 0, j = 0; i < n; i = j) {
		vector<int> vs;
		while (j < n && by_s[j].first == by_s[i].first) {
			vs.push_back(by_s[j].second);
			++j;
		}
		for (int v : vs) {
			p[v] = v;
			sum[v] = s[v];
			st[v] = {v};
			for (int u : g[v]) {
				if (s[u] >= s[v]) continue;
				u = get(u);
				if (sum[u] >= s[v]) continue;
				while (!st[u].empty()) {
					ans[st[u].back()] = 0;
					st[u].pop_back();
				}
			}
		}
		for (int v : vs) {
			for (int u : g[v]) {
				if (s[u] <= s[v]) merge(v, u);
			}
		}
	}

	for (int i = 0; i < n; ++i) {
		cout << ans[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...