제출 #505099

#제출 시각아이디문제언어결과실행 시간메모리
505099tgbegimx무제 (POI11_dyn)C++14
100 / 100
695 ms28308 KiB
#include <bits/stdc++.h> #define ll int using namespace std; ll n,m,l,r,mid,dem,res=300005,mx[300005],mi[300005],cha[300005],i; bool dd[300005]; vector<ll> luu; vector<vector<ll> > a; void dfs1(ll u,ll p) { luu.push_back(u); cha[u]=p; for(auto v:a[u]) { if(v!=p) dfs1(v,u); } } void dfs2() { for(ll i=n-1;i>=0;i--) { ll u=luu[i]; mx[u]=-1e9;mi[u]=1e9; for(auto v:a[u]) { if(v!=cha[u]) { mx[u]=max(mx[u],mx[v]+1); mi[u]=min(mi[u],mi[v]+1); } } if(mi[u]>mid&&dd[u]) mx[u]=max(mx[u],0); if(mi[u]+mx[u]<=mid) mx[u]=-1e9; if(mx[u]==mid) {mx[u]=-1e9;mi[u]=0;dem++;} } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; for(i=1;i<=n;i++) { ll k; cin>>k; if(k==1) dd[i]=true; } a.resize(n+5); for(i=1;i<n;i++) { ll u,v; cin>>u>>v; a[u].push_back(v); a[v].push_back(u); } l=0;r=n; dfs1(1,1); while(l<=r) { mid=(l+r)/2;dem=0; dfs2(); if(mx[1]>=0) dem++; if(dem<=m) {res=min(res,mid);r=mid-1;} else l=mid+1; } cout<<res; return 0; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...