Submission #1219107

#TimeUsernameProblemLanguageResultExecution timeMemory
1219107brintonKeys (IOI21_keys)C++20
37 / 100
3091 ms22672 KiB
#include <bits/stdc++.h>
// #include "grader.cpp"
using namespace std;
struct Dsu{
	private:
	int N;
	vector<int> p;
	public:
    vector<vector<int>> child;
	Dsu(int iN){
		N = iN;
        p.resize(N);
        child.resize(N);
		for(int i = 0;i < N;i++) {
            p[i] = i;
            child[i].push_back(i);
        }
	}
	int get(int cur){
		if(p[cur] == cur) return cur;
		p[cur] = get(p[cur]);
		return p[cur];
	}
	void merge(int a,int b){
		int pa = get(a);
		int pb = get(b);
		if(pa == pb)return;
        if(child[pa].size() > child[pb].size()) swap(pa,pb);
        // merge pa to pb;
		p[pa] = pb;
        for(auto &i:child[pa]) child[pb].push_back(i);
	}
};
vector<int> find_reachable(vector<int> R, vector<int> U, vector<int> V, vector<int> C) {
    int N = R.size(),M = U.size();
    vector<int> cnt(N,0);

    vector<vector<pair<int,int>>> edges(N);
    for(int i = 0;i < M;i++){
        edges[C[i]].push_back({U[i],V[i]});
    }
    auto bfs = [&](int start){
        vector<int> used(N,false);
        queue<int> q;
        q.push(start);
        Dsu dsu(N);
        while(!q.empty()){
            int ckey = R[q.front()];
            q.pop();
            if(used[ckey]) continue;
            used[ckey] = true;
            for(auto [u,v]:edges[ckey]){
                if(dsu.get(u) == dsu.get(v)) continue;
                if(dsu.get(u) == dsu.get(start) || dsu.get(v) == dsu.get(start)){
                    if(dsu.get(v) == dsu.get(start)) swap(u,v);
                    // merge v into
                    for(auto i:dsu.child[dsu.get(v)]) q.push(i);
                }
                dsu.merge(u,v);
            }
        }
        return dsu.child[dsu.get(start)].size();
    };
    for(int i = 0;i < N;i++){
        cnt[i] = bfs(i);
    }
    // for(auto &i:cnt) cout << i << " ";cout << "!" << endl;
    int minsz = *min_element(cnt.begin(),cnt.end());
    vector<int> ans(N,0);
    for(int i = 0;i < N;i++) ans[i] = (cnt[i] == minsz);
    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...