zoukankan      html  css  js  c++  java
  • [POI2013]LUK-Triumphal arch

    题目链接

    此题的答案k具有可二分性

    那么我们可以二分答案k,然后跑一个树形DP

    (dp[i])表示到节点(i)时需要再多染色的点数

    那么有(dp[i]=max(sum_{fa[j]=i} (dp[j]+1)-k,0))

    (dp[1]=0)则答案k可行

    #include"cstdio"
    #include"cstring"
    #include"iostream"
    #include"algorithm"
    using namespace std;
    
    const int MAXN=1e5+5;
    
    int n,np;
    int h[MAXN],f[MAXN];
    struct rpg{
    	int li,nx;
    }a[MAXN<<1];
    
    void add(int ls,int nx)
    {
    	a[++np]=(rpg){h[ls],nx};h[ls]=np;
    	a[++np]=(rpg){h[nx],ls};h[nx]=np;
    }
    
    void dfs(int x,int fa,int mid)
    {
    	int sum=0;f[x]=0;
    	for(int i=h[x];i;i=a[i].li){
    		if(a[i].nx!=fa){
    			dfs(a[i].nx,x,mid);
    			sum+=f[a[i].nx]+1;
    		}
    	}f[x]=max(sum-mid,0);
    	return;
    }
    
    bool check(int mid)
    {
    	int sum=0;f[1]=0;
    	for(int i=h[1];i;i=a[i].li){
    		dfs(a[i].nx,1,mid);
    		sum+=f[a[i].nx]+1;
    	}f[1]=max(sum-mid,0);
    	return !f[1];
    }
    
    int main()
    {
    	scanf("%d",&n);for(int i=1;i<n;++i){int x,y;scanf("%d%d",&x,&y),add(x,y);}
    	int l=0,r=n;
    	while(l<r){
    		int mid=l+r>>1;
    		if(check(mid)) r=mid;
    		else l=mid+1;
    	}printf("%d
    ",l);
    	return 0;
    }
    
    用先进的科学技术与思想文化武装起来的人民,是一个国家最巨大的生产力,是一个社会最强大的推动力,是一个民族最坚实的自信力,是一支军队最可靠的战斗力。 ——A·H
  • 相关阅读:
    JS表格测试
    2018电脑选购配置
    一句话技巧总结
    我的码风
    友情链接
    写代码时需要注意的一些东西
    他是 ISIJ 第四名,也是在线知名题库的洛谷“网红”
    从并查集的按秩合并看一类构造性问题
    高一上期末考游记
    P3233 [HNOI2014]世界树
  • 原文地址:https://www.cnblogs.com/AH2002/p/9620493.html
Copyright © 2011-2022 走看看