E70 树形DP+二分 P3554 [POI2013] LUK-Triumphal arch

视频链接:E70 树形DP+二分 P3554 [POI2013] LUK-Triumphal arch_哔哩哔哩_bilibili

 

 

P3554 [POI2013] LUK-Triumphal arch - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 树形DP+二分 O(nlogn)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=300005;
int idx,head[N];
struct E{int v,ne;}e[N<<1];
void add(int x,int y){
  e[++idx]={y,head[x]};
  head[x]=idx;
}
int n,f[N],mid;

void dfs(int u,int fa){
  for(int i=head[u];i;i=e[i].ne){
    int v=e[i].v;
    if(v==fa) continue;
    dfs(v,u);
    f[u]+=f[v]+1;
  }
  f[u]=max(f[u]-mid,0);
}
int main(){
  scanf("%d",&n);
  for(int i=1,x,y;i<n;i++){
    scanf("%d%d",&x,&y);
    add(x,y); add(y,x);
  }
  int l=-1,r=n;
  while(l+1<r){
    memset(f,0,sizeof(f));
    mid=(l+r)>>1; 
    dfs(1,0);
    if(!f[1]) r=mid;
    else l=mid;
  }
  printf("%d\n",r);
}

  

posted @ 2024-10-19 22:34  董晓  阅读(71)  评论(0编辑  收藏  举报