https://www.luogu.com.cn/problem/P3523
跟https://blog.csdn.net/liufengwei1/article/details/115410709一样
改了一点地方,就是只有当前点时关键点时,g[u]初始为0,否则则为-inf。这题还有点卡常,第一次没点O2优化超时了,因为用了vector,点了O2后900+ms,洛谷评测姬3e5 nlogn都这么慢的么。。。
#include<bits/stdc++.h>
using namespace std;
const int maxl=3e5+10;
const int inf=1e9+10;
int n,m,cnt,ans;
int f[maxl],g[maxl];
vector<int> e[maxl];
bool key[maxl];
inline void prework()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;scanf("%d",&x);
key[i]=x;
}
for(int i=1;i<=n-1;i++)
{
int u,v;scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
}
inline void dfs(int u,int fa,int mid)
{
g[u]=key[u]?0:-inf;f[u]=inf;
for(int v:e[u])
if(v!=fa)
{
dfs(v,u,mid);
g[u]=max(g[v]+1,g[u]);
f[u]=min(f[v]+1,f[u]);
}
if(f[u]+g[u]<=mid)
g[u]=-inf;
else if(g[u]==mid)
f[u]=0,g[u]=-inf,cnt++;
}
inline bool jug(int mid)
{
cnt=0;
dfs(1,0,mid);
if(g[1]>=0) cnt++;
return cnt<=m;
}
inline void mainwork()
{
int l=0,r=n;
while(l+1<r)
{
int mid=(l+r)>>1;
if(jug(mid))
r=mid;
else
l=mid;
}
ans=jug(l)?l:r;
}
inline void print()
{
printf("%d",ans);
}
int main()
{
prework();
mainwork();
print();
return 0;
}