update
This commit is contained in:
		
							parent
							
								
									bdb8bea73f
								
							
						
					
					
						commit
						6edf150bd1
					
				| @ -48,6 +48,7 @@ ll lca(ll u,ll v){ | ||||
|         } | ||||
|     } | ||||
|     return fa[u][0]; | ||||
|      | ||||
| } | ||||
| 
 | ||||
| int main(){ | ||||
|  | ||||
							
								
								
									
										66
									
								
								src/P5021/P5021.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/P5021/P5021.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | ||||
| #include <bits/stdc++.h> | ||||
| 
 | ||||
| using ll = int64_t; | ||||
| using std::cin,std::cout; | ||||
| 
 | ||||
| const ll maxn=5e4+5, inf=(ll(1)<<60); | ||||
| ll n,m,mins{inf},maxs,g[maxn],f[maxn]; | ||||
| std::vector<std::pair<ll,ll>> adj[maxn]; | ||||
| 
 | ||||
| void dfs(ll fth,ll u,const ll &num){ | ||||
|     std::vector<ll> vec; | ||||
|     for(auto [v,w]:adj[u]){ | ||||
|         if(fth==v)continue; | ||||
|         dfs(u,v,num); | ||||
|         f[u]+=f[v]; | ||||
|         if(ll ff=g[v]+w;ff>=num){ | ||||
|             ++f[u]; | ||||
|         }else{ | ||||
|             vec.emplace_back(ff); | ||||
|         } | ||||
|     } | ||||
|     std::sort(vec.begin(),vec.end()); | ||||
|     ll l{0},r{ll(vec.size())-1}; | ||||
|     while(l<r){ | ||||
|         if(vec[l]+vec[r]>=num){ | ||||
|             f[u]++; | ||||
|             l++,r--; | ||||
|         }else{ | ||||
|             l++; | ||||
|         } | ||||
|     } | ||||
|     if(l==r){ | ||||
|         g[u]=vec[r]; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool check(ll num){ | ||||
|     std::fill(f,f+1+n,0); | ||||
|     std::fill(g,g+1+n,0); | ||||
|     dfs(0,1,num); | ||||
|     return f[1]>=m; | ||||
| } | ||||
| 
 | ||||
| int main(){ | ||||
|     cin>>n>>m; | ||||
|     for(ll i{1};i<n;i++){ | ||||
|         ll u,v,w; | ||||
|         cin>>u>>v>>w; | ||||
|         mins=std::min(mins,w); | ||||
|         maxs+=w; | ||||
|         adj[u].emplace_back(v,w); | ||||
|         adj[v].emplace_back(u,w); | ||||
|     } | ||||
| 
 | ||||
|     ll l{mins},r{maxs},ans{l},mid; | ||||
|     while(l<=r){ | ||||
|         mid=(l+r)/2; | ||||
|         if(check(mid)){ | ||||
|             ans=mid; | ||||
|             l=mid+1; | ||||
|         }else{ | ||||
|             r=mid-1; | ||||
|         } | ||||
|     } | ||||
|     cout<<ans<<'\n'; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user