Submission #1060587

#TimeUsernameProblemLanguageResultExecution timeMemory
1060587jamjanekKeys (IOI21_keys)C++17
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>
using namespace std;

int rozmiar[300010];
int father1[300010];
int father2[300010];
int ojciec[300010];
int find1(int x){
	if(father1[x]==x)return x;
	return father1[x] = find1(father1[x]);
}
void union1(int a, int b){
	a = find1(a);
	b = find1(b);
	if(a!=b)
		father1[b] = a;
}
set<int>klucze[300010];
set<int>graf[300010];
set<pair<int,int>>zablokowane[300010];

int find2(int x){
	if(father2[x]==x)return x;
	return father2[x] = find2(father2[x]);
}
void union2(int a, int b){
	a = find2(a);
	b = find2(b);
	if(rozmiar[a] < rozmiar[b])swap(a,b);
	rozmiar[a]+=rozmiar[b];
	father2[b] = a;
	for(auto j: graf[b])
		graf[a].insert(j);
	for(auto j: klucze[b]){
		if(klucze[a].find(j)!=klucze[a].end())continue;
		klucze[a].insert(j);
		auto pom = zablokowane[a].lower_bound({j,-1});
		while((pom)!=zablokowane[a].end() && (*pom).first==j){
			graf[a].insert((*pom).second);
			zablokowane[a].erase(*pom);
			pom = zablokowane[a].lower_bound({j, -1});
		}
	}
	for(auto j: zablokowane[b]){
		if(klucze[a].find(j.first)!=klucze[a].end())
			graf[a].insert(j.second);
		else
			zablokowane[a].insert(j);
	}
}
int main()
{
	int n, m, a, b, c, i;
	assert(scanf("%d%d", &n, &m));
	for(i=0;i<n;i++){
		assert(scanf("%d", &a));
		father1[i] = i;
		father2[i] = i;
		rozmiar[i] = 1;
		klucze[i].insert(a);
		ojciec[i] = -1;
	}
	for(i=0;i<m;i++){
		assert(scanf("%d%d%d", &a, &b, &c));
		if(klucze[a].find(c)!=klucze[a].end())
			graf[a].insert(b);
		else
			zablokowane[a].insert({c,b});
		if(klucze[b].find(c)!=klucze[b].end())
			graf[b].insert(a);
		else
			zablokowane[b].insert({c,a});
	}
	queue<int>kolejka;
	for(i=0;i<n;i++){
		if(graf[i].size()>0)
			kolejka.push(i);
	}
	while(kolejka.size()){
		int x = kolejka.front();
		kolejka.pop();
		x = find2(x);
		ojciec[x] = find2(*(graf[x].begin()));
		//printf("%d %d\n", x, ojciec[x]);
		graf[x].erase(graf[x].begin());
		if(find1(ojciec[x])!=find1(x)){
			union1(x, ojciec[x]);
			continue;
		}
		vector<int>pom;
		int z = ojciec[x];
		while(find2(z)!=find2(x)){
			pom.push_back(z);
			z = ojciec[z];
		}
		pom.push_back(z);
		for(i=1;i<(int)pom.size();i++){
			union2(pom[i-1], pom[i]);
		}
		x = find2(x);
		//printf("po zcaleniu %d\n", x);
		ojciec[x] = -1;
		while(!graf[x].empty() && find2(*graf[x].begin())==x){
			graf[x].erase(graf[x].begin());
		}
		if(graf[x].size()>0)
			kolejka.push(x);
	}
	int wynik = n;
	for(i=0;i<n;i++)
		if(ojciec[find2(i)]==-1)
			wynik = min(wynik, rozmiar[find2(i)]);
	for(i=0;i<n;i++)
		printf("%d ", (ojciec[find2(i)]==-1 && wynik==rozmiar[find2(i)]));
//	for(i=0;i<n;i++)
//		printf("%d ", ojciec[find2(i)]);
//	for(i=0;i<n;i++)
//		printf("%d ", rozmiar[find2(i)]);
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccxbrWdU.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccjyH6iU.o:keys.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccxbrWdU.o: in function `main':
grader.cpp:(.text.startup+0x30a): undefined reference to `find_reachable(std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status