Submission #1041062

#TimeUsernameProblemLanguageResultExecution timeMemory
1041062ReLiceKeys (IOI21_keys)C++17
100 / 100
589 ms83648 KiB
#include <bits/stdc++.h> #define ll int #define pb push_back #define vll vector<ll> #define fr first #define sc second #define ins insert #define sz size() using namespace std; const int N = 3e5 + 7; const int inf = 1e9; vector<vector<pair<ll,ll>>> g(N); int p[N]; vll have(N,0); vll vis(N,0); ll cen[N]; vector<ll> r; vector<vll> need(N); vector<vll> cmp(N); vll er,er2; int n; bool merge(ll a,ll b){ a=p[a],b=p[b]; cen[a]=cen[b]; if(a==b)return false; if(cmp[a].sz>cmp[b].sz)swap(a,b); for(auto i : cmp[a]){ cmp[b].pb(i); p[i]=b; } return true; } ll bfs(ll v){ queue<ll> q; q.push(v); while(q.sz){ ll x=q.front(); q.pop(); if(vis[x])continue; if(!have[r[x]]){ for(auto i : need[r[x]]){ if(p[x]!=p[i])return p[i]; q.push(i); } } vis[x]=have[r[x]]=1; er.pb(x); for(auto i : g[x]){ ll to=i.fr,key=i.sc; if(have[key]==0){ need[key].pb(to); er2.pb(key); }else{ if(p[to]!=p[x])return p[to]; q.push(to); } } } return -1; } void cl(){ for(auto i : er){ have[r[i]]=vis[i]=0; } for(auto i : er2) need[i].clear(); er.clear(); er2.clear(); } vector<int> find_reachable(vector<int> R, vector<int> u, vector<int> v, vector<int> c) { r=R; n = r.size(); int m=u.size(); for(int i=0;i<m;i++){ g[u[i]].pb({v[i],c[i]}); g[v[i]].pb({u[i],c[i]}); } vector<int> ans(n,0); int mn=inf; set<int> st; for(int i=0;i<n;i++){ cmp[i].pb(i); p[i]=i; cen[i]=i; } while(true){ vll to(n,0); bool f=0; for(int i=0;i<n;i++){ if(p[i]!=i) continue; to[i]=bfs(cen[i]); if(to[i]>=0)f=1; cl(); } if(!f)break; for(int i=0;i<n;i++){ if(p[i]!=i || to[i]==-1) continue; ll v=p[to[i]]; if(p[i]==v)continue; merge(i,v); } } for(int i=0;i<n;i++){ if(i!=p[i])continue; if(p[i]==i)bfs(cen[i]); for(auto j : er)ans[j]=er.sz; if(p[i]==i){ mn=min(mn,ans[cen[i]]); } cl(); } for(int i=0;i<n;i++){ if(ans[i]==mn)ans[i]=1; else ans[i]=0; } 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...