제출 #977265

#제출 시각아이디문제언어결과실행 시간메모리
977265imarn자매 도시 (APIO20_swap)C++14
100 / 100
276 ms65476 KiB
#include<bits/stdc++.h> #define f first #define s second #define pb push_back #define pii pair<int,int> #define ll long long #define sz(x) (ll)x.size() using namespace std; const int mxn=3e5+5; vector<int>g[mxn]; int pr[mxn]{0},cur,d[mxn]{0},dp[mxn]{0},dep[mxn]{0},up[mxn][20]{0}; bool cyc[mxn]{0},ok=0; int get(int r){ return pr[r]==r?r:pr[r]=get(pr[r]); } void dfs(int u,int p,int l){ up[u][0]=p;dep[u]=l; for(int i=1;i<20;i++)up[u][i]=up[up[u][i-1]][i-1]; for(auto v:g[u]){ if(v==p)continue; if(!cyc[v])dp[v]=dp[u]; dfs(v,u,l+1); } } int qr(int a,int b){ if(dep[a]>dep[b])swap(a,b); for(int i=19;i>=0;i--)if(dep[b]-(1<<i)>=dep[a])b=up[b][i]; if(a==b)return dp[b]; for(int i=19;i>=0;i--)if(up[a][i]!=up[b][i])a=up[a][i],b=up[b][i]; return dp[up[a][0]]; } void init(int N, int M,std::vector<int> U, std::vector<int> V, std::vector<int> W){ cur=N;iota(pr,pr+mxn,0);vector<pair<int,pii>>ed; for(int i=0;i<M;i++){ ed.pb({W[i],{U[i],V[i]}}); }sort(ed.begin(),ed.end()); for(auto it : ed){ d[it.s.f]++;d[it.s.s]++; if(get(it.s.f)==get(it.s.s)){ g[cur].pb(get(it.s.f));pr[get(it.s.f)]=cur; dp[cur]=it.f;cyc[cur++]=1; }else{ int u=get(it.s.f),v=get(it.s.s); g[cur].pb(u);g[cur].pb(v); pr[u]=pr[v]=cur;dp[cur]=it.f; if(cyc[u]||cyc[v]||d[it.s.f]>=3||d[it.s.s]>=3)cyc[cur]=1; cur++; } }cur--;dfs(cur,cur,0);if(cyc[cur])ok=1; } int getMinimumFuelCapacity(int X, int Y){ if(!ok)return -1; else return qr(X,Y); }
#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...