Kattis - redblacktree Red Black Tree (树形背包)
问题:有一课含有n(n<=2e5)个结点的数,有m(m<=1000)个结点是红色的,其余的结点是黑色的。现从树中选若干数量的结点,其中红色的恰有k个,并且每个结点都不是其他任何另一个结点的后代,分别求出k=0,1,2,...,m的选法种数。(树根为1)
又是一道树形背包问题。只不过这个问题和普通的树形背包正好相反,选了一个结点就不能选它的祖先,但解法都是差不多的。
设dp[u][i]为在第u个结点及其子树下,红色结点数恰为i个的选法总数,则dp[u]为它的所有子结点的dp值构成的多项式的乘积加上结点本身的贡献,状态转移的时候模拟多项式的乘法就行了。
用FFT似乎也可以,但我没试,因为复杂度并不会比用siz上限优化了的直接转移要低,而且取模比较麻烦。
另外注意这道题的dp数组用long long会爆内存,只能用int存储,在运算的中间过程转化成long long。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+,inf=0x3f3f3f3f,mod=1e9+;
int n,m,hd[N],ne,a[N],siz[N],dp[N][+],b[+];
struct E {int v,nxt;} e[N];
void addedge(int u,int v) {e[ne]= {v,hd[u]},hd[u]=ne++;}
void dfs(int u) {
memset(dp[u],,sizeof dp[u]);
siz[u]=,dp[u][]=;
for(int i=hd[u]; ~i; i=e[i].nxt) {
int v=e[i].v;
dfs(v);
for(int j=; j<=siz[u]+siz[v]; ++j)b[j]=;
for(int j=siz[u]; j>=; --j)if(dp[u][j])
for(int k=siz[v]; k>=; --k)if(dp[v][k])
b[j+k]=(b[j+k]+(ll)dp[u][j]*dp[v][k])%mod;
for(int j=; j<=siz[u]+siz[v]; ++j)dp[u][j]=b[j];
siz[u]+=siz[v];
}
siz[u]+=a[u],dp[u][a[u]]=(dp[u][a[u]]+)%mod;
} int main() {
memset(hd,-,sizeof hd),ne=;
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i) {
int u;
scanf("%d",&u);
addedge(u,i);
}
for(int i=; i<m; ++i) {
int u;
scanf("%d",&u);
a[u]=;
}
dfs();
for(int i=; i<=m; ++i)printf("%d\n",dp[][i]);
return ;
}
Kattis - redblacktree Red Black Tree (树形背包)的更多相关文章
- poj2486Apple Tree[树形背包!!!]
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9989 Accepted: 3324 Descri ...
- 【bzoj4987】Tree 树形背包dp
题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...
- 计蒜客 Red Black Tree(树形DP)
You are given a rooted tree with n nodes. The nodes are numbered 1..n. The root is node 1, and m of ...
- ZOJ - 3201 Tree of Tree (树形背包)
题意:有一棵树,树上每个结点都有一个权值,求恰好包含k个结点的子树的最大权值. 设dp[i][j]为以结点i为根的树中包含j个结点的子树的最大权值,则可以把这个结点下的每棵子树中所包含的所有子树的大小 ...
- POJ2486 Apple Tree(树形背包)
从每个节点u出发后有两种情况:回到u和不回到u. dp数组设为三维,第一维是节点编号,第二维是从该节点开始走的步数,第三维1/0 表示是否回到该节点. 可以回到时:dp[u][j][1]=max(dp ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- vue_elementUI_ tree树形控件 获取选中的父节点ID
el-tree 的 this.$refs.tree.getCheckedKeys() 只可以获取选中的id 无法获取选中的父节点ID想要获取选中父节点的id;需要如下操作1. 找到工程下的node_m ...
- poj 1155 树形背包
http://blog.csdn.net/libin56842/article/details/9908199 树形背包: 首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next. tre ...
- UVa 1407 树形背包 Caves
这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 #include <iostream> #include <cstdio> #inclu ...
随机推荐
- Python基础(10)_内置函数、匿名函数、递归
一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的 ...
- PsySH——PHP交互式控制台
PsySH PsySH is a runtime developer console, interactive debugger and REPL for PHP. PsySH是一个PHP的运行时开发 ...
- Loadrunder脚本篇——web_submit_data实现提交post请求
概述 web_link()和web_url()函数都是页面访问型函数,实现HTTP请求中的GET方法,如果需要实现POST方法,可使用web_submit_form或web_submit_data() ...
- $Android自定义控件风格的方法
EditText在获取焦点后默认的边框都是黄色的,这可能和我在开发的应用的主题颜色不匹配,那怎么办呢?——用自定义的控件风格,比如说我想让EditText在获取焦点时候边框变成蓝色的,而失去焦点后边框 ...
- PHPExcel常用属性使用
PHPExcel常用属性使用 前景: 需先实例化几个变量: $this->objExcel = new PHPExcel(); //实例化一个PHPExcel变量 $this->objE ...
- 缩略图悬浮效果的jQuery焦点图
在线演示 本地下载
- Python多线程循环
背景:Python脚本:读取文件中每行,放入列表中:循环读取列表中的每个元素,并做处理操作. 核心:多线程处理单个for循环函数调用 模块:threading 第一部分: :多线程脚本 (该脚本只 ...
- 文件系统的特性,linux的EXT2文件系统【转】
本文转载自:https://blog.csdn.net/tongyijia/article/details/52809281 先来提出三个概念: - superblock - inode - bloc ...
- linux下firefox显示中文乱码的问题
只需要yum install "@Chinese Support" 然后注销,再登录一下,刷新浏览器就可以正常显示中文了,当然前提是浏览器的字符编码为utf-8以及默认显示中文,这 ...
- oracle 导出
一.导出csv文件 利用Oracle中的Spool缓冲池技术可以实现Oracle数据导出到文本文件. 1).在Oracle PL/SQL中输入缓冲开始命令,并指定输出的文件名: spool /tmp/ ...