Submission #444564

#TimeUsernameProblemLanguageResultExecution timeMemory
444564KLPPKeys (IOI21_keys)C++17
9 / 100
3086 ms39060 KiB
#include <vector> #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<b;i++) #define trav(a,v) for(auto a:v) typedef long long int lld; #define INF 1000000000000000LL class DSU{ int parent[1000000]; int sz[1000000]; int N; public: void init(int n){ rep(i,0,n)parent[i]=i,sz[i]=1; } int root(int node){ if(parent[node]==node)return node; parent[node]=root(parent[node]); return parent[node]; } void merge(int a, int b){ a=root(a); b=root(b); if(a==b)return; if(sz[a]<sz[b])swap(a,b); parent[b]=a; sz[a]+=sz[b]; } bool same(int a, int b){ if(root(a)==root(b))return true; return false; } int comp_size(int node){ return sz[root(node)]; } }; DSU D; int n,m; vector<int> edges[1000000]; bool used[1000000]; std::vector<int> find_reachable(std::vector<int> r, std::vector<int> u, std::vector<int> v, std::vector<int> c) { std::vector<int> ans(r.size()); n=r.size(); m=u.size(); rep(i,0,m){ edges[c[i]].push_back(i); } int minimal=n+1; rep(i,0,n){ D.init(n); rep(j,0,m)used[j]=false; bool stop=false; while(!stop){ stop=true; rep(j,0,n){ if(D.same(i,j) && !used[r[j]]){ used[r[j]]=true; stop=false; trav(a,edges[r[j]]){ D.merge(u[a],v[a]); } } } } //cout<<D.comp_size(i)<<endl; if(D.comp_size(i)<minimal){ minimal=D.comp_size(i); rep(j,0,n)ans[j]=0; ans[i]=1; } if(D.comp_size(i)==minimal){ minimal=D.comp_size(i); ans[i]=1; } } 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...