제출 #1219107

#제출 시각아이디문제언어결과실행 시간메모리
1219107brinton열쇠 (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...