【ARC083E】Bichrome Tree 树形dp
Description
有一颗N个节点的树,其中1号节点是整棵树的根节点,而对于第ii个点(2≤i≤N)(2≤i≤N),其父节点为PiPi
对于这棵树上每一个节点Snuke将会钦定一种颜色(黑或白),以及一个非负整数的点权。
Snuke有一个他最喜欢的整数序列,X1,X2,...,XNX1,X2,...,XN,他希望能够钦定这些点的点权和颜色。使得:
对于每一个点ii,都满足ii的整颗子数内所有和ii颜色相同的点(包括ii本身)的点权和恰好为XiXi。
现在给定你这棵树的结构和Snuke最喜欢的整数序列,请你判断是否有一种钦定的方案使得其满足上文所述的条件
Input
第一行一个正整数NN表示点的数量。
第二行N−1N−1个正整数,其中第ii个数表示编号为i+1i+1的点的父节点编号。
第三行NN个非负整数,表示Snuke最喜欢的整数序列。
Output
如果存在一种可行方案,则输出"POSSIBLE";
否则,输出"IMPOSSIBLE"
(不加引号)
Sample Input
Sample 1
3
1 1
4 3 2
Sample 2
3
1 2
1 2 3
Sample 3
8
1 1 1 3 4 5 5
4 1 6 2 2 1 3 3
Sample 4
1
0
Sample Output
Sample 1
POSSIBLE
Sample 2
IMPOSSIBLE
Sample 3
POSSIBLE
Sample 4
POSSIBLE
HINT
1≤N≤10001≤N≤1000
1≤Pi≤i−11≤Pi≤i−1
0≤Xi≤5000
Sol
首先我们发现,一个点的子树中的和只要小于等于\(w[x]\)即可,因为\(val[x]\)可以是任意非负整数,但是另外一种颜色的值要尽量小,这样对它的祖先节点的贡献会更大。所以我们用\(f[x]\)表示x点子树中另一种颜色的最小值。
然后我们对于它的每个子节点做一次背包,子节点的权值要么是\(w[son]\),要么是\(f[son]\),而这两个值恰好一个给\(f[x]\)做贡献,一个给\(w[x]\)做贡献,这就是一个裸的背包了,用这两个式子结合转移即可,之后我们在\(0-w[i]\)中找到最小值并作为\(f[x]\)的值即可。如果全都是inf说明这个点找不到合适的取值,就return 0。
最后只需要判断dfs(1)的返回值即可。
Code
#include <bits/stdc++.h>
using namespace std;
int n,x,v[1005],f[1005],g[2][5005];vector<int>e[1005];
bool dfs(int x)
{
if(!e[x].size()){f[x]=0;return 1;}
for(int i=0;i<e[x].size();i++) if(!dfs(e[x][i])) return 0;
int w=1;memset(g[w],0x3f,sizeof(g[w]));g[w][0]=0;
for(int i=0;i<e[x].size();i++)
{
w=!w;memset(g[w],0x3f,sizeof(g[w]));
for(int j=0;j<=v[x];j++)
{
if(j>=f[e[x][i]]) g[w][j]=min(g[w][j],g[w^1][j-f[e[x][i]]]+v[e[x][i]]);
if(j>=v[e[x][i]]) g[w][j]=min(g[w][j],g[w^1][j-v[e[x][i]]]+f[e[x][i]]);
}
}
int gg=2147483647;
for(int i=0;i<=v[x];i++) gg=min(gg,g[w][i]);
if(gg>1e9) return 0;f[x]=gg;return 1;
}
int main()
{
scanf("%d",&n);
for(int i=2;i<=n;i++) scanf("%d",&x),e[x].push_back(i);
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
if(dfs(1)) puts("POSSIBLE");else puts("IMPOSSIBLE");
}
【ARC083E】Bichrome Tree 树形dp的更多相关文章
- 熟练剖分(tree) 树形DP
熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...
- hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)
题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: ...
- CF 461B Appleman and Tree 树形DP
Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】
题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...
- codeforces Round #263(div2) D. Appleman and Tree 树形dp
题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...
- POJ 2486 Apple Tree(树形DP)
题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...
随机推荐
- linux 下安装mysql-5.7.16
1.解压tar -xvf mysql的包 tar -xvf mysql-5.7.16-1.el6.x86_64.rpm-bundle.tar(mysql 官网中即可找到) 2.查看是否需要卸载安装时候 ...
- Centos7 超简单将Centos的yum源更换为国内的阿里云源
1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...
- 使用GY89的BMP180模块获取温度和压强(海拔)
最近要用一下GY89,GY89有三个模块,温度压强.加速度计.陀螺仪.通过不同的片选信号来选择. mbed库上都写好了,挺好的. 以下是自己的代码: #include "mbed.h&quo ...
- 摄影之HDR
摄影之HDR 高动态范围图像(High-Dynamic Range,简称HDR),相比普通的图像,可以提供更多的动态范围和图像细节,根据不同的曝光时间的LDR(Low-Dynamic Range)图像 ...
- Mybatis工具Generator
转自:http://www.cuiyongzhi.com/post/36.html MyBatis Generator(以下简称为MBG),可以逆向生成持久层的基本代码,而且mybatis的实现方案比 ...
- 页面中CSS的四种引入方式的介绍与比较
转自:https://blog.csdn.net/qq_38689666/article/details/79039392 一:行内式 <p style="color:red" ...
- springMVC第一天
这些是springMVC3.2所用到的jar包 web.xml配置 <?xml version="1.0" encoding="UTF-8"?> & ...
- Functions & Closures
[Functions] 1.不带返回值的函数: 2.通过tuple返回元素 返回的tuple可按如下方式使用: 3.External Parameter: External parameter的使用: ...
- 【HDU4307】Matrix
本篇博客基本全篇转自https://www.cnblogs.com/staginner/archive/2012/08/13/2636826.html,太强啦ORZ 题意 A是个1*n的矩阵,每个元素 ...
- Linux下cacti的安装
Cacti安装手册 第一步. Cacti的架构 第二步. Cacti的工作流程 第三步. Cacti简介 1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用r ...