제출 #1162593

#제출 시각아이디문제언어결과실행 시간메모리
1162593ASGA_RedSea경주 (Race) (IOI11_race)C++20
0 / 100
0 ms320 KiB
/** * بسم الله الرحمن الرحيم * ﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿ */ /// author : "ASGA" #pragma GCC optimize("Ofast") #include<bits/stdc++.h> using namespace std; using ll=long long; #include "race.h" int n,k,ans=1e9,inf=1e9; vector<vector<array<ll,2>>>a; vector<int>sz,vis,d,dd; int mn,mx,mmn,mmx,tot; void gsz(int i,int p){ sz[i]=1; for(auto&[j,w]:a[i]){ if(!vis[j]&&j!=p){gsz(j,i);sz[i]+=sz[j];} } } int gc(int i,int p){ for(auto&[j,w]:a[i]){ if(!vis[j]&&j!=p&&sz[j]*2>tot)return gc(j,i); } return i; } void calc1(int i,int p,int dis,int dpt){ d[dis]=min(d[dis],dpt); mx=max(mx,dis); for(auto&[j,w]:a[i]){ if(!vis[j]&&j!=p&&dis+w<=k)calc1(j,i,dis+w,dpt+1); } } void calc(int i){ gsz(i,-1);tot=sz[i]; int c=gc(i,-1); vis[c]=1; mmn=mmx=0; d[0]=dd[0]=0; for(auto&[j,w]:a[c]){ if(vis[j]||w>k)continue; mn=mx=w; d[0]=0; calc1(j,c,w,1); mmx=max(mmx,mx); for(int l=mn;l<=mx;l++){ ans=min(ans,dd[k-l]+d[l]); } for(int l=mn;l<=mx;l++){dd[l]=min(dd[l],d[l]);d[l]=inf;} } ans=min(ans,dd[k]); for(int l=mmx;l<=mmx;l++)dd[l]=inf; for(auto&[j,w]:a[c]){ if(!vis[j])calc(j); } } int best_path(int N,int K,int H[][2],int L[]){ n=N;k=K;a.resize(n); for(int i=0;i+1<n;i++){ int u=H[i][0],v=H[i][1],w=L[i]; a[u].push_back({v,w}); a[v].push_back({u,w}); } vis.assign(n,0);sz=vis; d.assign(k+1,inf);dd=d; calc(0); return (ans==inf?-1: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...