제출 #1149057

#제출 시각아이디문제언어결과실행 시간메모리
1149057sasde경주 (Race) (IOI11_race)C++20
0 / 100
11 ms23872 KiB
#include<bits/stdc++.h> #define str string #define task "strdel" #define ii pair<int,int> #define iii pair<int,ii> #define iv pair<ii,ii> #define se second #define fi first #define ffi fi.fi #define sfi se.fi #define sse se.se #define fse fi.se #define lt(i, c, d) for(int i = c; i <= d; ++i) #define fl(i, c, d) for(int i = d; i >= c; --i) #define pb push_back #define emb emplace_back #define emf emplace_front #define em emplace using namespace std; const int N=1e6+5,lg=20,mod=1e9+7; mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int Rand(int u,int v){ return u+rd()%(v-u+1); } int n,dp[N],k,ans=1e9; vector<ii>a[N]; int sz[N]; bool check[N]; void dfs(int u,int cha){ sz[u]=1; for(ii v:a[u]){ if(check[v.fi]||v.fi==cha)continue; dfs(v.fi,u); sz[u]+=sz[v.fi]; } } int fin(int u,int cha,int n){ for(ii v:a[u]){ if(!check[v.fi]&&v.fi!=cha&&sz[v.fi]>n/2) return fin(v.fi,u,n); } return u; } void add(int u,int cha,int sum,int canh){ // cout <<u<<" "<<sum<<" "<<canh<<" "<<cha <<'\n'; ans=min(ans,canh+dp[k-sum]); for(ii v:a[u]){ if(v.fi==cha||check[v.fi]||sum+v.se>k)continue; add(v.fi,u,v.se+sum,canh+1); } } stack<int>s; void them(int u,int cha,int sum,int canh){ dp[sum]=min(dp[sum],canh); s.push(sum); for(ii v:a[u]){ if(v.fi==cha||check[v.fi]||sum+v.se>k)continue; them(v.fi,u,v.se+sum,canh+1); } } void buildcen(int u,int cha){ dfs(u,-1); int g=fin(u,-1,sz[u]); for(ii v:a[g]){ if(v.fi==cha||check[v.fi]|v.se>k)continue; add(v.fi,g,v.se,1); them(v.fi,g,v.se,1); } // cout<<'\n'; check[g]=true; while(!s.empty()){ if(s.top()!=0)dp[s.top()]=1e9; s.pop(); } for(ii v:a[g]){ if(v.fi==cha||check[v.fi])continue; buildcen(v.fi,g); } } // int b[N][2]; // int w[N]; int best_path(int n,int k,int b[][2],int w[]){ // cin >> n >> k; // for(int i=1;i<n;++i)cin >> b[i][0]>>b[i][1]; for(int i=1;i<n;++i){ int u=b[i][0]+1,v=b[i][1]+1; // cin >> w; a[u].emb(v,w[i]); a[v].emb(u,w[i]); } for(int i=1;i<=k;++i)dp[i]=1e9; buildcen(1,-1); return (ans==1e9?-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...