【JSOI2018】潜入行动
【JSOI2018】潜入行动
树形\(DP\)。设\(f_{i,j,0/1,0/1}\)表示以\(i\)为根的子树中,用了\(j\)个监听器,是否放置了监听器,是否被监听的方案数。转移就多讨论几种情况就好了。
关键问题是直接这么做是\(O(NK^2)\)的。
解决方案就是,我们别\(DP\)边维护子树的大小\(size\),每次枚举子树的监听器的时候不能超过\(min\{size,k\}\)。这看似只是一个常数优化,但其实可以吧复杂度降到\(O(NK)\)。
可以看这位dalao的证明
\(DP\)的时候按合并的两个子树大小分为三种情况:
- 两个子树\(size\)均大于\(k\)。
- 其中一个大于\(k\),另一个小于等于\(k\)
- 两个子树大小均小于等于\(k\)
然后对于复杂度的分析:
- 合并一次\(O(k^2)\),但是最多这样合并\(\frac{n}{k}\)次。
- 考虑小的那颗子树每个点贡献一次复杂度。并且以后不会再贡献,因为合并后子树大小大于\(k\)了。
- 考虑每个点贡献的次数就是每个合并时另一颗子树的大小。所以每个点最多贡献\(K\)次。
所以复杂度\(O(NK)\)
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 100005using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}const ll mod=1e9+7;
int n,k;
struct road {int to,next;}s[N<<1];
int h[N],cnt;
void add(int i,int j) {s[++cnt]=(road) {j,h[i]};h[i]=cnt;}
ll f[N][105][2][2];
ll g[105][2][2];
int size[N];void dfs(int v,int fr) {size[v]=1;f[v][0][0][0]=1;f[v][1][1][0]=1;for(int i=h[v];i;i=s[i].next) {int to=s[i].to;if(to==fr) continue ;dfs(to,v);int lim=min(k,size[v]);memset(g,0,sizeof(g));for(int j=0;j<=lim;j++) {int lim2=min(size[to],k-j);for(int q=0;q<=lim2;q++) {(g[j+q][0][0]+=f[v][j][0][0]*f[to][q][0][1])%=mod;(g[j+q][0][1]+=f[v][j][0][1]*(f[to][q][0][1]+f[to][q][1][1])+f[v][j][0][0]*f[to][q][1][1])%=mod;(g[j+q][1][0]+=f[v][j][1][0]*(f[to][q][0][1]+f[to][q][0][0]))%=mod;(g[j+q][1][1]+=f[v][j][1][1]*(f[to][q][0][0]+f[to][q][0][1]+f[to][q][1][0]+f[to][q][1][1]))%=mod;(g[j+q][1][1]+=f[v][j][1][0]*(f[to][q][1][0]+f[to][q][1][1]))%=mod;}}memcpy(f[v],g,sizeof(g));size[v]+=size[to];}
}int main() {n=Get(),k=Get();int a,b;for(int i=1;i<n;i++) {a=Get(),b=Get();add(a,b),add(b,a);}dfs(1,0);int ans=0;ans=(ans+f[1][k][0][1]+f[1][k][1][1])%mod;cout<<ans;return 0;
}
转载于:https://www.cnblogs.com/hchhch233/p/10512855.html
【JSOI2018】潜入行动相关推荐
- 【题解】P4516 [JSOI2018] 潜入行动
[题解]P4516 [JSOI2018] 潜入行动 比较常规但是有点思维含量的一道树形 DP. 题目链接 P4516 [JSOI2018] 潜入行动 题意概述 给定一棵有 \(n\) 个点的树,现在要 ...
- 树形dp进阶题2 JSOI2018潜入行动
JSOI2018 潜入行动 题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JY ...
- [bzoj5314][Jsoi2018]潜入行动_树形背包dp
潜入行动 bzoj-5314 Jsoi-2018 题目大意:题目链接. 注释:略. 想法: 学长给我们除了一套考试题,三个学长一人一道这是T1. 好吧好吧,傻逼背包...... 复杂度$O(nk)$. ...
- bzoj 5314 [Jsoi2018]潜入行动
http://www.elijahqi.win/archives/3640 Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有 ...
- 洛谷:P4516 [JSOI2018] 潜入行动(树形dp、树上分组背包统计方案数)
潜入行动 题意: 在树上每个点可以放置监控设备,监控该点周围的点(不包括该点),问刚好放置 k 个监控设备监控使得整棵树所有点都被监控的方案数是多少. 思路: 显然是个树形dp,k个监控自然联想分组背 ...
- bzoj5314: [Jsoi2018]潜入行动【树形dp】
Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSO Ier抵御外星人的进攻.在黄金舰队就位之前,JYY打算事先了解外星人 ...
- Luogu P4516 [JSOI2018] 潜入行动
题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JYY 打算事先了解外星人的进攻 ...
- [JSOI2018]潜入行动
题解 一道思路不难但是写起来很麻烦的树形背包 我们发现每个节点有很多信息需要保留 所以就暴力的设\(f[u][j][0/1][0/1]\)表示点u的子树分配了j个监察器,点u有没有被控制,点u放没放监 ...
- 洛谷P4516:[JSOI2018]潜入行动(树形dp)
题面 大概就是树形dp 设f[i][j][0/1][0/1]f[i][j][0/1][0/1]f[i][j][0/1][0/1],表示iii的子树里选了j" role="prese ...
- 深度式睡眠潜入虚拟世界_潜入swiftui的惊人世界
深度式睡眠潜入虚拟世界 介绍: (Introduction:) SwiftUI is the most exciting news since Apple has announced Swift in ...
最新文章
- nginx 502错误 upstream sent too big header while reading response header from upstream
- zabbix items 配置
- [原创]敏捷管理实践看板思维导图
- Apache Maven 入门篇
- 图像处理中的秩、低秩、稀疏
- gradle的配置文件build.gradle、gradle.properties、settings.gradle示例
- 千年老二的 Python 值得学吗?
- centos7 + python 2.7 + pip + openvswitch 杂项问题
- 边缘计算应用场景_从6大应用场景,看边缘计算落地生根
- 初学python-练习_1使用python编写计算班级学生平均分程序
- 检测网络变化(wifi、2g、3g、4g)
- 50款PS完美汉化插件一键安装,win+mac
- 计算机基础知识vf试题及答案,2016年计算机二级考试《VF》上机试题及答案(1)
- 【深度学习】YOLOv7目标检测模型使用记录 yolov7-tiny
- 头条面试题:判断一个数是否是happy number(每一位的平方和最终为1)
- 互联网大厂轮流买单,春晚红包却不再“药到病除”?
- JDK动态代理过程中报错interface ** is not visible from class loader
- Outlook邮箱开源许可-android
- 玩电脑的岂能不知道excel怎么合并单元格?
- 一文了解下一代互联网核心技术HTTP/3及技术发展