题目:https://loj.ac/problem/2546

dp[ i ][ j ][ 0/1 ][ 0/1 ] 表示 i 子树,用 j 个点,是否用 i , i 是否被覆盖。

注意 s1<=s0 ,别弄出负角标。

用 if 判断一下,如果有值再转移,会快非常多。

复杂度是 O(n*k) 的。证明:https://www.cnblogs.com/cjyyb/p/10416839.html

先约定如果一个小于 k 的子树和一个大于 k 的子树合并,在小于 k 的子树那里看复杂度。

1.两个小于 k 的子树 cr 和 v 合并,且合并完之后还是小于 k 的;

  对于 cr 里的每个点,要和 v 的每个点产生贡献。虽然和很多 v 都这样做了,但这些 v 的大小加起来小于 k (因为规定合并完还是小于 k ),所以一个点贡献 O(k) 次。

  如果合并完大于 k ,就在 “一个小于 k 的子树和一个大于 k 的子树合并” 的部分考虑复杂度了。

2.一个小于 k 的子树 cr 和一个大于 k 的子树 v 合并。

  对于 cr 里的每个点,此时都要进行 O(k) 次贡献。合并完之后 cr 的大小变成大于 k ,所以这种贡献,每个点只会经历一次。

3.一个大于 k 的子树 cr 和一个大于 k 的子树 v 合并。

  产生 k2 的贡献。如果是两个大小为 k 的子树,合并之后大小变成 2*k ;再合并进来一个大小为 k 的,大小就变成 3*k ;即这种合并最多 \( \frac{n}{k} \) 次。

综上,复杂度是 O(n*k) 的。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
const int N=1e5+5,M=105,mod=1e9+7;
int upt(int x){while(x>=mod)x-=mod;while(x<0)x+=mod;return x;}int n,k,hd[N],xnt,to[N<<1],nxt[N<<1];
int siz[N],dp[N][M][2][2],tp[2][2];
void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;}
void cz(int &x,int y){x=upt(x+y);}
void dfs(int cr,int fa)
{dp[cr][0][0][0]=dp[cr][1][1][0]=1; siz[cr]=1;for(int i=hd[cr],v;i;i=nxt[i])if((v=to[i])!=fa){dfs(v,cr);for(int s0=Mn(k,siz[cr]+siz[v]);s0>=0;s0--){tp[0][0]=tp[0][1]=tp[1][0]=tp[1][1]=0;for(int s1=Mx(0,s0-siz[cr]),lm=Mn(s0,Mn(siz[v],k));s1<=lm;s1++){int d=s0-s1;if(dp[cr][d][0][0]){cz(tp[0][0],(ll)dp[cr][d][0][0]*dp[v][s1][0][1]%mod);cz(tp[0][1],(ll)dp[cr][d][0][0]*dp[v][s1][1][1]%mod);}if(dp[cr][d][0][1])cz(tp[0][1],(ll)dp[cr][d][0][1]*(dp[v][s1][0][1]+dp[v][s1][1][1])%mod);if(dp[cr][d][1][0]){cz(tp[1][0],(ll)dp[cr][d][1][0]*(dp[v][s1][0][0]+dp[v][s1][0][1])%mod);cz(tp[1][1],(ll)dp[cr][d][1][0]*(dp[v][s1][1][0]+dp[v][s1][1][1])%mod);}if(dp[cr][d][1][1]){cz(tp[1][1],(ll)dp[cr][d][1][1]*((ll)dp[v][s1][0][0]+dp[v][s1][0][1]+dp[v][s1][1][0]+dp[v][s1][1][1])%mod);}}for(int f0=0;f0<=1;f0++)for(int f1=0;f1<=1;f1++)dp[cr][s0][f0][f1]=tp[f0][f1];}siz[cr]+=siz[v];}
}
int main()
{n=rdn();k=rdn();for(int i=1,u,v;i<n;i++)u=rdn(),v=rdn(),add(u,v),add(v,u);dfs(1,0);printf("%d\n",upt(dp[1][k][0][1]+dp[1][k][1][1]));return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10749068.html

LOJ 2546 「JSOI2018」潜入行动——树形DP相关推荐

  1. LOJ 2547 「JSOI2018」防御网络——思路+环DP

    题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...

  2. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  3. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  4. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  5. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  6. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  7. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  8. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  9. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

最新文章

  1. Linux2.6内核--内存管理(2)--区
  2. Java中的运行期类型鉴定
  3. Intellij IDEA(Android Studio)好用的插件和软件
  4. Vue基础之表单控件绑定
  5. mysql执行计划中的temp_MYSQL语句调优:GROUP BY ORDER BY语句中出现USING TEMPATORY
  6. 【Linux】快速搭建一个基于Vue的大型单页应用
  7. pip install urllib3[secure] 报错 error: ffi.h: No such file or directory
  8. 一个精心制作的页眉样式
  9. Let 's watch TV
  10. 打开本地安全策略的方式
  11. 完美池宇峰畅谈创业点滴 男怕入错行
  12. blender弯曲物体
  13. linux 使用samba共享文件夹
  14. 计算机文字转表格,Word怎么把文字转换成表格 30秒搞定
  15. PMP章节练习(第六章:项目进度管理)
  16. SQL Server 开发指南
  17. Linux【第一篇总结】
  18. 离散数学实验2 关联矩阵、相邻矩阵、生成树、环路空间、断集空间的求解 C++
  19. javascript中的onpropertychange事件 与 jquery中的propertychange事件
  20. 基于 cz88 纯真IP数据库开发的 IP 解析服务 - 支持 http 协议请求或 rpc 协议请求,也支持第三方包的方式引入直接使用

热门文章

  1. 寄存器在哪里_二、汇编之寄存器
  2. python人头识别_python+opencv实现人头检测
  3. 卷积滤波 英文_3. 数码相机内的图像处理基本图像滤波
  4. python:文件路径多级获取
  5. 创建QT项目时只有.pro文件,源文件和头文件
  6. 中国SaaS人力资源管理系统市场发展模式分析与前景深度研究报告2022年版
  7. 对话尹成杰三农谋定压舱石-农业大健康·万祥军:稳农保供
  8. 中科微研课题上犹授牌-农业大健康·李喜贵:谋定功能性农业
  9. Java IO流之字符缓冲流
  10. 由防止表单重复提交引发的一系列问题--servletRequest的复制、body值的获取