Submission #1108832

#TimeUsernameProblemLanguageResultExecution timeMemory
1108832siewjhKeys (IOI21_keys)C++17
100 / 100
510 ms67628 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300005;
int keya[MAXN], p[MAXN], recj[MAXN], minv, rnd;
bool dead[MAXN], hask[MAXN], vis[MAXN];
vector<pair<int, int>> adj[MAXN];
vector<int> ansl, ks, pro;
int root(int x){
	if (p[x] == -1) return x;
	else return p[x] = root(p[x]);
}
void join(int ra, int rb){
	p[ra] = rb;
}
void clear(){
	for (int x : ks) hask[x] = 0;
	for (int x : pro) vis[x] = 0; 
	ks.clear(); pro.clear();
}
void search(int st){
	clear();
	queue<int> q; map<int, vector<int>> lckm;
	q.push(st);
	while (!q.empty()){
		int x = q.front(); q.pop();
		int rx = root(x);
		if (rx == st){
			if (vis[x]) continue;
			pro.push_back(x); vis[x] = 1;
			if (!hask[keya[x]]){
				ks.push_back(keya[x]); hask[keya[x]] = 1;
				for (int nn : lckm[keya[x]]) q.push(nn);
				lckm.erase(keya[x]);
			}
			for (auto [nn, nt] : adj[x]){
				if (hask[nt]) q.push(nn);
				else lckm[nt].push_back(nn);
			}
		}
		else{
			join(st, rx);
			recj[rx] = rnd;
			return;
		}
	}
	dead[st] = 1;
	if (pro.size() < minv){
		minv = pro.size();
		ansl.clear();
		for (int x : pro) ansl.push_back(x);
	}
	else if (pro.size() == minv){
		for (int x : pro) ansl.push_back(x);
	}
}
vector<int> find_reachable(vector<int> key, vector<int> u, vector<int> v, vector<int> lock){
	int nodes = key.size(), edges = lock.size();
	for (int i = 0; i < nodes; i++){
		keya[i] = key[i]; p[i] = -1;
	}
	for (int i = 0; i < edges; i++){
		int a = u[i], b = v[i], c = lock[i];
		adj[a].push_back({b, c});
		adj[b].push_back({a, c});
	}
	minv = MAXN;
	for (rnd = 1;; rnd++){
		bool run = 0;
		for (int i = 0; i < nodes; i++){
			if (root(i) != i || dead[i] || recj[i] == rnd) continue;
			run = 1;
			search(i);
		}
		if (!run) break;
	}
	vector<int> ans(nodes, 0);
	for (int x : ansl) ans[x] = 1;
	return ans;
}

Compilation message (stderr)

keys.cpp: In function 'void search(int)':
keys.cpp:47:17: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   47 |  if (pro.size() < minv){
      |      ~~~~~~~~~~~^~~~~~
keys.cpp:52:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   52 |  else if (pro.size() == minv){
      |           ~~~~~~~~~~~^~~~~~~
#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...