제출 #1055407

#제출 시각아이디문제언어결과실행 시간메모리
1055407mariaclara열쇠 (IOI21_keys)C++17
37 / 100
3051 ms27420 KiB
#include <vector>
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define mk make_pair
#define pb push_back
#define fr first
#define sc second

int n;
vector<vector<pii>> type_edges;
vector<vector<int>> edges;
vector<int> key;

int bfs(int ini) {
	vector<bool> vis(n,0), ad_key(n,0);
	queue<int> fila;
	fila.push(ini);
	edges.resize(n);
	vis[ini] = 1;

	int cnt = 0;
	while(!fila.empty()) {
		int x = fila.front();
		fila.pop();
		cnt++;
		
		if(!ad_key[key[x]]) {
			ad_key[key[x]] = 1;
			for(auto [a,b] : type_edges[key[x]]) {
				edges[a].pb(b);
				edges[b].pb(a);
				if(vis[a] and !vis[b]) fila.push(b), vis[b] = 1;
				if(vis[b] and !vis[a]) fila.push(a), vis[a] = 1;
			}
		}

		for(int viz : edges[x])
			if(!vis[viz]) vis[viz] = 1, fila.push(viz);
	}
	
	edges.clear();

	return cnt;
}

vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c) {
	n = sz(r);
	key = r;
	type_edges.resize(n);
	vector<int> ans(n);

	for(int i = 0; i < sz(u); i++) 
		type_edges[c[i]].pb({u[i],v[i]});

	int val = n;
	for(int i = 0; i < n; i++) {
		ans[i] = bfs(i);
		val = min(val, ans[i]);
	}

	for(int i = 0; i < n; i++)
		ans[i] = ans[i] == val;

	return ans;
}
#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...