Submission #441872

#TimeUsernameProblemLanguageResultExecution timeMemory
441872Stickfish열쇠 (IOI21_keys)C++17
0 / 100
4 ms7372 KiB
#include <vector>
#include <bitset>
using namespace std;

const int MAXN = 3e5 + 123;
vector<int> edg[MAXN];
int keyget[MAXN];
int keyneed[MAXN];
bitset<MAXN> used;

vector<int> solve_quad(int n){
	vector<int> ans(n);
	bitset<MAXN> used_cl;
	vector<vector<int>> reachable(n);
	for(int i = 0; i < n; ++i){
		for(int j = 0; j < n; ++j){
			used[j] = used_cl[j] = 0;
			reachable[j].clear();
		}
		vector<int> stck = {i};
		while(stck.size()){
			int v = stck.back();
			used[v] = used_cl[keyget[v]] = 1;
			for(auto u : reachable[keyget[v]]){
				stck.push_back(u);
			}
			reachable[keyget[v]].clear();
			stck.pop_back();
			for(auto u : edg[v]){
				if(used[u])
					continue;
				if(used_cl[keyneed[u]]){
					stck.push_back(u);
				} else {
					reachable[keyneed[u]].push_back(u);
				}
			}
		}
		ans[i] = used.count() - 1;
	}
	return ans;
}

vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c) {
	int n = r.size();
	int m = u.size();
	for(int i = 0; i < n; ++i){
		keyget[i] = r[i];
		keyneed[i] = c[i];
	}
	for(int i = 0; i < m; ++i){
		edg[u[i]].push_back(v[i]);
		edg[v[i]].push_back(u[i]);
	}
	if(n <= 2000 && m <= 2000){
		return solve_quad(n);
	}
}

Compilation message (stderr)

keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:58:1: warning: control reaches end of non-void function [-Wreturn-type]
   58 | }
      | ^
#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...