제출 #1066028

#제출 시각아이디문제언어결과실행 시간메모리
1066028epicci23열쇠 (IOI21_keys)C++17
0 / 100
43 ms78936 KiB
#include "bits/stdc++.h" #define all(v) v.begin() , v.end() #define sz(a) (int)a.size() using namespace std; const int N = 3e5 + 5; map<int,vector<int>> v[N]; set<int> s[N]; vector<int> cur,par(N,0),vis(N,0),mark(N,0); vector<int> comp[N]; void merge_info(int a,int b){ a=par[a],b=par[b]; if(a==b) return; if(sz(comp[a])<sz(comp[b])) swap(a,b); mark[a]|=mark[b]; for(int x:comp[b]){ comp[a].push_back(x); par[x]=a; } comp[b].clear(); for(int u:s[b]) s[a].insert(u); s[b].clear(); for(auto x:v[b]) for(int u:x.second) v[a][x.first].push_back(u); v[b].clear(); } void dfs(int c){ if(vis[c]) return; cur.push_back(c); vis[c]=1; for(int u:s[par[c]]){ while(!v[par[c]][u].empty()){ int x=v[par[c]][u].back(); v[par[c]][u].pop_back(); if(x==par[c]) continue; if(vis[x]==2){ mark[par[c]]=1; continue; } if(vis[x]==1){ while(!cur.empty() && par[cur.back()]!=par[x]){ merge_info(cur.back(),x); cur.pop_back(); } } else{ dfs(x); if(par[c]!=par[x]) mark[par[c]]=1; } } } if(!cur.empty() && cur.back()==c) cur.pop_back(); vis[c]=2; } vector<int> find_reachable(vector<int> R, vector<int> U, vector<int> V, vector<int> C){ int n=sz(R),m=sz(U); iota(all(par),0); for(int i=0;i<n;i++) comp[i].push_back(i); for(int i=0;i<n;i++) s[i].insert(R[i]); for(int i=0;i<m;i++){ int a=U[i],b=V[i],c=C[i]; v[a][c].push_back(b); v[b][c].push_back(a); } for(int i=0;i<n;i++) if(vis[i]==0) dfs(i); int mini=100000007; for(int i=0;i<n;i++){ if(mark[par[i]]) continue; mini=min(mini,sz(comp[par[i]])); } vector<int> ans(n,0); for(int i=0;i<n;i++) if(!mark[par[i]] && sz(comp[par[i]])==mini) ans[i]=1; return ans; } /*void _(){ int n,m; cin >> n >> m; iota(all(par),0); for(int i=0;i<n;i++) comp[i].push_back(i); vector<int> col(n); for(int i=0;i<n;i++) cin >> col[i]; for(int i=0;i<n;i++) s[i].insert(col[i]); for(int i=0;i<m;i++){ int a,b,c; cin >> a >> b >> c; v[a][c].push_back(b); v[b][c].push_back(a); } for(int i=0;i<n;i++) if(vis[i]==0) dfs(i); int mini=100000007; for(int i=0;i<n;i++){ if(mark[par[i]]) continue; mini=min(mini,sz(comp[par[i]])); } vector<int> ans(n,0); for(int i=0;i<n;i++) if(!mark[par[i]] && sz(comp[par[i]])==mini) ans[i]=1; for(int i=0;i<n;i++) cout << ans[i] << " \n"[i==n-1]; } int32_t main(){ cin.tie(0); ios::sync_with_stdio(0); int tc=1;//cin >> tc; while(tc--) _(); return 0; }*/
#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...