Submission #1295896

#TimeUsernameProblemLanguageResultExecution timeMemory
1295896Jawad_Akbar_JJStranded Far From Home (BOI22_island)C++20
0 / 100
596 ms8316 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<18;
int s[N], Par[N], Sz[N], Ans[N], ans[N], lst, n, m;
vector<pair<int,int>> Vec;
vector<pair<int, pair<int, int>>> E;

int root(int v){
	return (Par[v] == v ? v : Par[v] = root(Par[v]));
}

int main(){
	cin>>n>>m;

	for (int i=1;i<=n;i++){
		cin>>s[i], Par[i] = i, Sz[i] = s[i];
		s[0] = max(s[0], s[i]);
	}

	for (int i=1, a, b;i<=m;i++){
		cin>>a>>b;
		if (s[a] < s[b])
			swap(a, b);
		E.push_back({s[a], {a, b}});
	}
	sort(begin(E), end(E));

	for (auto [p, ab] : E){
		auto [a, b] = ab;
		int A = root(a), B = root(b);
		if (A == B)
			continue;

		if (Sz[B] >= s[a])
			Vec.push_back({B, a});
		Par[B] = A;
		Sz[A] += Sz[B];
	}

	for (int i=1;i<=n;i++)
		Ans[i] = (s[i] == s[0]);

	reverse(begin(Vec), end(Vec));
	for (auto [B, a] : Vec)
		Ans[B] |= Ans[a];

	for (int i=1;i<=100;i++){
		for (int i=1;i<=n;i++)
			ans[i] = Ans[i], Par[i] = i;
		for (auto [p, ab] : E){
			auto [a, b] = ab;
			int A = root(a), B = root(b);
			if (A == B)
				continue;

			Par[B] = A;
			Ans[A] |= ans[B];
			ans[A] |= ans[B];
		}

		for (auto [B, a] : Vec)
			Ans[B] |= Ans[a];
	}

	for (int i=1;i<=n;i++)
		cout<<Ans[i];
	cout<<'\n';
}

/*

4 4
1 2 4 6
1 2
1 3
2 3
3 4

*/
#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...