问题:有一课含有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 (树形背包)的更多相关文章

  1. poj2486Apple Tree[树形背包!!!]

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9989   Accepted: 3324 Descri ...

  2. 【bzoj4987】Tree 树形背包dp

    题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...

  3. 计蒜客 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 ...

  4. ZOJ - 3201 Tree of Tree (树形背包)

    题意:有一棵树,树上每个结点都有一个权值,求恰好包含k个结点的子树的最大权值. 设dp[i][j]为以结点i为根的树中包含j个结点的子树的最大权值,则可以把这个结点下的每棵子树中所包含的所有子树的大小 ...

  5. POJ2486 Apple Tree(树形背包)

    从每个节点u出发后有两种情况:回到u和不回到u. dp数组设为三维,第一维是节点编号,第二维是从该节点开始走的步数,第三维1/0 表示是否回到该节点. 可以回到时:dp[u][j][1]=max(dp ...

  6. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  7. vue_elementUI_ tree树形控件 获取选中的父节点ID

    el-tree 的 this.$refs.tree.getCheckedKeys() 只可以获取选中的id 无法获取选中的父节点ID想要获取选中父节点的id;需要如下操作1. 找到工程下的node_m ...

  8. poj 1155 树形背包

    http://blog.csdn.net/libin56842/article/details/9908199 树形背包: 首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next. tre ...

  9. UVa 1407 树形背包 Caves

    这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 #include <iostream> #include <cstdio> #inclu ...

随机推荐

  1. iOS 52个技巧学习心得笔记 第一章 熟悉OC

    1 .简单了解OC2 .在类的头文件中尽量少引入其他头文件3 .多用字面量语法 少用与之等价的方法 4 .多用类型常量 少用 #define 预处理指令5 .用枚举表示状态,选项,状态码 .简单了解O ...

  2. 如何选择合适的Linux系统进行桌面程序开发?

    32 or 64 ? 众所周知,64位的Windows系统可以近乎完美地运行32位的应用程序,微软出于商业考虑做了这样一个兼容层.而Linux系统则划分的很清楚,默认情况下64位的Linux系统无法运 ...

  3. 【Topcoder】SRM157 DIV2总结

    250分题:简单的二分,就是平常玩的猜数字游戏 代码:GitHub 500分题:给出一个员工一天的打卡时间段,要求求出员工这一天的工资.其中正常上班时间是6:00:00到18:00:00,薪水是wag ...

  4. 跨平台移动开发_PhoneGap API Camera 使用摄像头采集照片.

    camera对象提供对设备默认摄像头应用程序的访问. 程序运行效果 相关代码 <!DOCTYPE html> <html> <head> <title> ...

  5. jQuery仿苹果样式焦点图插件

    在线演示 本地下载

  6. Struts的url-pattern配置问题

    一,servlet容器对url的匹配过程: 当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://loca ...

  7. java入门了解04

    1.异常的体系:---------|Throwable --------------| Error (错误) 错误一般是由于jvm或者是硬件引发的问题,所以我们一般都不会通过代码去处理.------- ...

  8. linux基础(9)-获取时间

    获取今天日期 date +%Y-%m-%d date +%y-%m-%d date  +%F   获取昨天日期 date -d yesterday +%F date -d -1day +%F     ...

  9. java中@Qualifier("string")是什么用法

    @Qualifier("XXX") Spring的Bean注入配置注解,该注解指定注入的Bean的名称,Spring框架使用byName方式寻找合格的bean,这样就消除了byTy ...

  10. 阅读linux内核代码的工具-- Source Insight

    http://blog.csdn.net/luckyaslan/article/details/7869235 Step 1:安装Source Insight并启动程序 可以进入图1界面,在工具条上有 ...