P4516 [JSOI2018] 潜入行动 题解
题意:
给定一棵无根树,要求给树上 \(k\) 个点标记,使得所有点都至少与一个被标记的点相邻。(注意自己被标记不代表与标记相邻)
思路
考虑树形DP。
套路地设 \(f_{u,i,0/1,0/1}\) 表示树上的点 \(u\) 及其子树内已经被标记了 \(i\) 个点,自己有没有被标记、自己有没有与标记相邻。
然后考虑转移。发现对于一棵子树的根 \(u\) 和 其某个儿子 \(v\),如果要转移那 \(u\) 本身就已经与标记或者 \(v\) 被标记或者二者兼而有之。
然后就对应转移即可。
复杂度的证明有些神秘,事实上这个东西与分块是类似的。我们将子树大小小于 \(k\) 的树叫做小块,大于等于 \(k\) 的叫做大块。
- 如果是一些大块合并(当然也可以间杂一些小块)成为一个更大的块,由于我么枚举的上限是 \(k\) ,因此大块间的合并一次是 \(k^2\) 的,但是大块间的合并是不超过 \(\frac{n}{k}\) 次的,因此大块间合并的总复杂度为 \(O(nk)\)。
- 如果是一些小块(其中没有大块)合并成为了大块,那么与1类似的分析,这种小块合成大块的出现次数也小于等于 \(\frac{n}{k}\)。
- 如果是小块与小块合并后还是小块,那这种情况的总时间复杂度就是 \(O(nk)\)。
然后就可以了。
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll p=1e9+7;
const int N=1e5+7,M=105;
int n,k,tot[N],f[N][M][2][2],siz[N];
vector <int> q[N];
void dfs(int u,int fa){
ll tmp[M][2][2];memset(tmp,0,sizeof(tmp));siz[u]=1;
f[u][0][0][0]=f[u][1][1][0]=1;
for(int i=0;i<tot[u];i++){
int v=q[u][i];if(v==fa) continue;
dfs(v,u);
for(int a=0;a<=min(k,siz[u]);a++)
for(int b=0;b<=min(k,siz[v])&&a+b<=k;b++){
for(int p1=0;p1<2;p1++)for(int q1=0;q1<2;q1++)
for(int p2=0;p2<2;p2++)for(int q2=0;q2<2;q2++)
if(q2|p1)
tmp[a+b][p1][q1|p2]=(tmp[a+b][p1][q1|p2]+1ll*f[u][a][p1][q1]*f[v][b][p2][q2]%p)%p;
}
siz[u]+=siz[v];
for(int j=0;j<=k;j++) for(int p1=0;p1<2;p1++) for(int q1=0;q1<2;q1++) f[u][j][p1][q1]=tmp[j][p1][q1],tmp[j][p1][q1]=0;
}
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>k;
for(int i=1,u,v;i<=n-1;i++){cin>>u>>v;q[u].push_back(v),tot[u]++;q[v].push_back(u),tot[v]++;}
dfs(1,0);
cout<<(f[1][k][1][1]+f[1][k][0][1])%p;
return 0;
}
P4516 [JSOI2018] 潜入行动 题解的更多相关文章
- BZOJ5314:[JSOI2018]潜入行动——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5314 https://www.luogu.org/problemnew/show/P4516 ht ...
- luogu P4516 [JSOI2018]潜入行动
LINK:潜入行动 初看题感觉很不可做 但是树形dp的状态过于明显. 容易设\(f_{x,j,l,r}\)表示x为根子树内放了j个设备且子树内都被覆盖l表示x是否被覆盖r表示x是否放设备的方案数. 初 ...
- 洛谷 P4516 [JSOI2018]潜入行动
题面传送门 一眼树形 \(dp\) 本题有 \(2\) 大难点. 难点之一是状态的设计,这里需要四维状态,\(dp[i][j][0/1][0/1]\) 表示在以 \(i\) 为根的子树内放了 \(j\ ...
- 【BZOJ5314】[JSOI2018]潜入行动(动态规划)
[BZOJ5314][JSOI2018]潜入行动(动态规划) 题面 BZOJ 洛谷 题解 不难想到一个沙雕\(dp\),设\(f[i][j][0/1][0/1]\)表示当前点\(i\),子树中一共放了 ...
- BZOJ5314: [Jsoi2018]潜入行动
BZOJ5314: [Jsoi2018]潜入行动 https://lydsy.com/JudgeOnline/problem.php?id=5314 分析: 裸树形背包,设\(f[x][i][0/1] ...
- [bzoj5314][Jsoi2018]潜入行动_树形背包dp
潜入行动 bzoj-5314 Jsoi-2018 题目大意:题目链接. 注释:略. 想法: 学长给我们除了一套考试题,三个学长一人一道这是T1. 好吧好吧,傻逼背包...... 复杂度$O(nk)$. ...
- BZOJ5314 [Jsoi2018]潜入行动 【背包类树形dp】
题目链接 BZOJ5314 题解 设\(f[i][j][0|1][0|1]\)表示\(i\)为根的子树,用了\(j\)个监测器,\(i\)节点是否被控制,\(i\)节点是否放置的方案数 然后转移即可 ...
- bzoj 5314: [Jsoi2018]潜入行动
Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSO Ier抵御外星人的进攻.在黄金舰队就位之前,JYY打算事先了解外星人 ...
- BZOJ5314: [Jsoi2018]潜入行动 (树形DP)
题意:一棵树选择恰好k个结点放置监听器 每个监听器只能监听相邻的节点 问能使得所有节点被监听的种类数 题解:反正就是很well-known的树形DP了 至于时间复杂度为什么是nk 不会不学 很好想到四 ...
- [loj2546][JSOI2018]潜入行动(树形DP)
题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JYY 打算事先了解外星人的进攻 ...
随机推荐
- Microsoft.Expression.Drawing文件安装
使用Blend的绘制功能,需要引用 Microsoft.Expression.Drawing 库文件, xmlns:ed="http://schemas.microsoft.com/expr ...
- QT5笔记:10. 容器类的迭代
1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...
- 详解vue-router基本使用
来源:https://m.jb51.net/article/111499.htm 本篇文章主要介绍了详解vue-router基本使用,详细的介绍了vue-router的概念和用法,有兴趣的可以了解 ...
- word 批量制作ppt
将 Word 文档作为大纲,构建演示文稿 在 Word 文档中,单击"开始". 使用"样式"设置 Word 文档中内容的格式. 突出显示要用作幻灯片标题的内容, ...
- SICK Ranger3源码分析——断线重连
前言 本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读,体验更加 简单分析一下SICK Ranger3源码中断 ...
- 自行为一加6编译Postmarket os内核
序 在为自己的一加6刷上PostmarketOS后突然某一天想使用它的照相机功能.原因是想到使用pmos拍照后笔者可以直接使用scp指令来传输手机相片到自己运行着GNU/Linux的电脑上,就感到相对 ...
- 第十八届全国大学生信息安全竞赛暨第二届“长城杯”铁人三项赛web方向部分wp
第十八届全国大学生信息安全竞赛暨第二届"长城杯"铁人三项赛web方向部分wp hello_web 查看源代码发现有两个文件,访问一下 Tips是phpinfo 里面可以看到disa ...
- ant design pro 使用 getFieldValue、setFieldsValue
getFieldValue 获取表单指定 name 值,setFieldsValue 为表单指定 name 设定值 import type { ProFormInstance } from '@ant ...
- vue 格式化时间戳
前言 有时候我们需要前端处理后端传过来的时间戳进行格式化为日期. Html部分 template中这样使用,需要处理的字段名,再加上过滤器方法 <el-table-column label=&q ...
- windows linux子系统(Ubuntu)ip地址
在Windows10安装好了的子系统(Ubuntu)上,安装了nginx 想去访问,使用ipconfig .ip add,查询来的ip地址都跟自己Windows10的ip完全一样,难道Linux子系统 ...