Luogu P3554 [POI2013]LUK-Triumphal arch

Descripe

答案具有二分性,可以二分

显然,人是没有办法回头的,具有最优子结构的性质,考虑树形DP

令f[i]表示以i为根(不包括i)的子树中还需要多少个节点(如果不需要,即为0,不为负)

f[u]=max( (∑f[v]+1)-mid,0 )

如果f[1]>0,则不行

#include<bits/stdc++.h>
using namespace std;

const int N=2e6+5;
int n,cnt,to[N],nxt[N],he[N],f[N];

inline void add(int u,int v) {
    to[++cnt]=v,nxt[cnt]=he[u],he[u]=cnt;
}

void dfs(int fa,int u,int mid) {
    f[u]=0;
    for(int e=he[u];e;e=nxt[e]) {
        int v=to[e];
        if(v!=fa) {
            dfs(u,v,mid);
            f[u]+=f[v]+1;
        }
    }
    f[u]=max(f[u]-mid,0);
}

int main() {
    scanf("%d",&n);
    for(int i=1;i<n;i++) {
        int u,v; scanf("%d%d",&u,&v);
        add(u,v),add(v,u);
    }
    int l=0,r=n,ans=0;
    while(l<=r) {
        int mid=l+r>>1;
        dfs(0,1,mid);
        if(f[1]>0) l=mid+1;
            else ans=mid,r=mid-1;
    }
    printf("%d\n",ans);
    return 0;
} 

 

posted @ 2020-09-02 20:24  wwwsfff  阅读(121)  评论(0编辑  收藏  举报