Submission #1184227

#TimeUsernameProblemLanguageResultExecution timeMemory
1184227ttamxSwapping Cities (APIO20_swap)C++20
100 / 100
216 ms26032 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; const int N=200005; const int LG=18; const int INF=INT_MAX/2; int n,m; int fa[N],par[LG][N],a[N],dep[N],deg[N]; bool ok[N]; int fp(int u){return fa[u]=u==fa[u]?u:fp(fa[u]);} int lca(int u,int v){ if(dep[u]<dep[v])swap(u,v); for(int i=LG-1;i>=0;i--)if(dep[par[i][u]]>=dep[v])u=par[i][u]; if(u==v)return u; for(int i=LG-1;i>=0;i--)if(par[i][u]!=par[i][v])u=par[i][u],v=par[i][v]; return par[0][u]; } void init(int _n,int _m,vector<int> _u,vector<int> _v,vector<int> _w){ n=_n,m=_m; vector<tuple<int,int,int>> e; for(int i=0;i<m;i++)e.emplace_back(_w[i],_u[i],_v[i]); sort(e.begin(),e.end()); iota(fa,fa+2*n,0); fill(a,a+2*n,INF); int cur=n; for(auto [w,u,v]:e){ bool good=(++deg[u]>2||++deg[v]>2); u=fp(u),v=fp(v); if(u!=v){ fa[u]=fa[v]=par[0][u]=par[0][v]=cur; ok[cur]=good||ok[u]||ok[v]; if(ok[cur])a[cur]=w; cur++; }else{ a[u]=min(a[u],w); ok[u]=true; } } par[0][cur-1]=cur-1; for(int i=cur-2;i>=0;i--){ int p=par[0][i]; dep[i]=dep[p]+1; a[i]=min(a[i],a[p]); } for(int i=1;i<LG;i++)for(int u=0;u<cur;u++)par[i][u]=par[i-1][par[i-1][u]]; } int getMinimumFuelCapacity(int u,int v){ int res=a[lca(u,v)]; return res<INF?res:-1; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...