codeforces 1053D 树形DP
题意:给一颗树,1为根节点,有两种节点,min或者max,min节点的值是它的子节点的值中最小的,max节点的值是它的子节点的值中最大的,若共有k个叶子,叶子的值依次为1~k。
问给每个叶子的值赋为几使根节点的值最大。
思路:设\(dp[x]\)为节点x为根的子树中x的最大值,\(sz[x]\)
为节点x的子树中叶子的个数,可以推出x在它的子树中能选的叶子数量即为以x为根的子树中x的最大值。
若x为max节点,\(dp[x]=max(sz[x]-sz[y]+dp[y])\),y是x的子节点,意思是当选择y作为最大值时,x还能再多选\(sz[x]-sz[y]\)个叶子。
若x为min节点,先加上所有的\(sz[y]-dp[y]\),既y的子树中不能选的叶子个数,若x有z个子树,则有z-1个叶子不能选,
所以,\(dp[x]=sz[x]-\sum (sz[y]-dp[y])-z+1\)
    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define bug cout<<"--------------"<<endl
    using namespace std;
    typedef long long ll;
    const double PI=acos(-1.0);
    const double eps=1e-6;
    const int inf=1e9;
    const int mod=1e9+7;
    const int maxn=3e5+10;
    int dp[maxn],sz[maxn];
    vector<int>f[maxn];
    int p[maxn];
    int n;
    void dfs(int u)
    {
        if(f[u].size()==0){
            dp[u]=1;
            sz[u]=1;
            return;
        }
        int tmp=0;
        for(int x:f[u]){
            dfs(x);
            sz[u]+=sz[x];
        }
        for(int x:f[u]){
            if(p[u]) tmp=max(tmp,sz[u]-sz[x]+dp[x]);
            else tmp+=sz[x]-dp[x];
        }
        if(p[u]) dp[u]=tmp;
        else dp[u]=sz[u]-tmp-f[u].size()+1;
    }
    int main(){
    	ios::sync_with_stdio(false);
    	//freopen("in","r",stdin);
    	cin>>n;
    	for(int i=1;i<=n;i++){
            cin>>p[i];
    	}
    	for(int i=2,x;i<=n;i++){
            cin>>x;
            f[x].push_back(i);
    	}
    	dfs(1);
    	cout<<dp[1]<<endl;
    	return 0;
    }
												
											codeforces 1053D 树形DP的更多相关文章
- Codeforces 1153D 树形DP
		
题意:有一个游戏,规则如下:每个点有一个标号,为max或min, max是指这个点的值是所有子节点中值最大的那一个,min同理.问如何给这颗树的叶子节点赋值,可以让这棵树的根节点值最大. 思路:很明显 ...
 - Codeforces 1088E 树形dp+思维
		
比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...
 - Codeforces 1179D 树形DP 斜率优化
		
题意:给你一颗树,你可以在树上添加一条边,问添加一条边之后的简单路径最多有多少条?简单路径是指路径中的点只没有重复. 思路:添加一条边之后,树变成了基环树.容易发现,以基环上的点为根的子树的点中的简单 ...
 - CodeForces - 337D 树形dp
		
题意:一颗树上有且仅有一只恶魔,恶魔会污染距离它小于等于d的点,现在已经知道被污染的m个点,问恶魔在的可能结点的数量. 容易想到,要是一个点到(距离最远的两个点)的距离都小于等于d,那么这个点就有可能 ...
 - CodeForces 219D 树形DP
		
D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...
 - codeforces 337D 树形DP Book of Evil
		
原题直通车:codeforces 337D Book of Evil 题意:一棵n个结点的树上可能存在一个Evil,Evil危险范围为d,即当某个点与它的距离x<=d时,那么x是危险的. 现已知 ...
 - Up and Down the Tree CodeForces - 1065F (树形dp)
		
链接 题目大意:给定$n$结点树, 假设当前在结点$v$, 有两种操作 $(1)$移动到$v$的子树内任意一个叶子上 $(2)$若$v$为叶子, 可以移动到距离$v$不超过$k$的祖先上 初始在结点$ ...
 - Codeforces 1120D (树形DP 或 最小生成树)
		
题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...
 - Codeforces 735E 树形DP
		
题意:给你一棵树,你需要在这棵树上选择一些点染成黑色,要求染色之后树中任意节点到离它最近的黑色节点的距离不超过m,问满足这种条件的染色方案有多少种? 思路:设dp[x][i]为以x为根的子树中,离x点 ...
 
随机推荐
- 使用ASP.Net WebAPI构建REST服务——客户端
			
原文的链接:http://www.cnblogs.com/TianFang/p/3724449.html WebAPI是标准的Http协议,支持Http协议的客户端(如浏览器)都可以访问.但是,有的时 ...
 - SpringBoot+MyBatis连接数据库
			
SpringBoot通过MyBatis连接数据库有2种方法: 1.注解 2.XML文件 1.注解 1.构建项目 2.添加依赖: <dependencies> <dependency& ...
 - SharePoint 2007——内容管理之归档篇
			
如果需要使用这个功能普通的站点上(没有使用Record Center站点模板的站点),必须激活'Office SharePoint Server Publishing’ featue. 在使用Rec ...
 - Ubuntu通过Pyenv管理python版本
			
网上安装使用Pyenv的教程很多,但是实测有很多教程有坑,经过多家比较发现下面的教程可用,内容全面,与大家分享. 首先安装pyenv全家桶 curl -L https://raw.githubuser ...
 - css-table属性运用
			
最近在工作中遇到了一些不常用的布局,很多使用 CSS table 属性,并结合 ::before,::after 伪元素完成了,使得 HTML 的结构相对更简单,更具有语义性.当 HTML 结构越清晰 ...
 - 25个增强iOS应用程序性能的提示和技巧 — 中级篇
			
本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...
 - VS中生成、清理项目、调试、開始运行(不调试)、Debug 和 Release等之间的差别
			
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/helloUSB2010/article/details/35802437 一.生成和又一次生成 &q ...
 - 判断浏览器是否为ie的最快方法
			
var ie = !-[1,]; alert(ie); 只要6 bytes!它利用了IE与标准浏览器在处理数组的toString方法的差异做成的.对于标准游览器,如果数组里面最后一个字符为逗号,JS引 ...
 - 1692. [USACO07DEC] 队列变换【后缀数组+贪心】
			
Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席 ...
 - 1、JVM-走进java
			
1.1.概述 Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统.移动终端.企业服务器.大 ...