[JSOI2018] 潜入行动 题解

news/2024/10/15 22:10:48

T6 [JSOI2018] 潜入行动

很套路、很裸的一道树形 DP。看了状态就会推方程的那种。

\(f_{u,i,0/1,0/1}\) 表示以 \(u\) 为根的子树中有 \(i\) 个监听器、\(u\) 有没有监听器、\(u\) 有没有被监听的方案数。

显然要枚举子节点 \(v\)\(u\) 的监听器数量 \(i\)\(v\) 的监听器数量 \(j\)。用 \(f_{u,i}\)\(f_{v,j}\) 推出 \(f_{u,i+j}\)

然后挨个推一下就完了。

\(u\) 不放,也没有被监听,则 \(v\) 必定不放,但根据题意 \(v\) 之前需要被监听。故:

\[f_{u,i+j,0,0}=\sum f_{u,i,0,0}\times f_{v,j,0,1} \]

\(u\) 放了,但没有被监听,则 \(v\) 必定不放,且 \(v\) 之前是否被监听无所谓。故:

\[f_{u,i+j,1,0}=\sum f_{u,i,1,0}\times(f_{v,j,0,0}+f_{v,j,0,1}) \]

\(u\) 不放,但被监听了,此时分两种情况:要么 \(u\) 原本就被监听了,则 \(v\) 放不放无所谓,但因为 \(u\) 没放所以 \(v\) 之前需要被监听;要么 \(u\) 原本没有被监听,则需要 \(v\) 来监听 \(u\),也就是 \(v\) 必须放,同时因为 \(u\) 没放所以 \(v\) 之前需要被监听。故:

\[f_{u,i+j,0,1}=\sum\big(f_{u,i,0,1}\times(f_{v,j,0,1}+f_{v,j,1,1})+f_{u,i,0,0}\times f_{v,j,1,1}\big) \]

\(u\) 放了,也被监听了,此时分两种情况:要么 \(u\) 原本没有被监听,则 \(v\) 必须放来监听 \(u\),而 \(v\) 原本是否被监听无所谓;要么 \(u\) 原本就被监听了,此时 \(u\) 的所有限制都被满足,则 \(v\) 的情况也是不限的。故:

\[f_{u,i+j,1,1}=\sum\big(f_{u,i,1,0}\times(f_{v,j,1,0}+f_{v,j,1,1})+f_{u,i,1,1}\times(f_{v,j,0,0}+f_{v,j,1,0}+f_{v,j,0,1}+f_{v,j,1,1})\big) \]

就没了。

坑点:

  1. 空间复杂度是 \(O(4nk)\) 的,而本题贴心地给你开了 \(\texttt{256MB}\) 的空间,所以只能开 int 数组;
  2. 转移方程中出现的 \(f_{u,i}\) 需要开一个临时数组存储,否则会造成后效性影响转移;
  3. 转移结束后再写 siz[u]+=siz[v]
#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
using namespace std;char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){int x=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x;
}
void write(int x,char sf='\n'){if(x<0)putchar('-'),x=~x+1;int top=0;do str[top++]=x%10,x/=10;while(x);while(top)putchar(str[--top]+48);if(sf^'#')putchar(sf);
}
using ll=long long;
constexpr int MAXN=1e5+5,MOD=1e9+7;
int n,k,head[MAXN],tot;
struct{int v,to;}e[MAXN<<1];
void addedge(int u,int v){e[++tot]={v,head[u]};head[u]=tot;
}
void add(int&x,int y){x=x+y>=MOD?x+y-MOD:x+y;
}
int dp[MAXN][105][2][2],siz[MAXN],tmp[105][2][2];
void dfs(int u,int fno){siz[u]=dp[u][0][0][0]=dp[u][1][1][0]=1;for(int i=head[u],v=e[i].v;i;i=e[i].to,v=e[i].v){if(v==fno)continue;dfs(v,u);for(int i=0;i<=min(siz[u],k);++i){tmp[i][0][0]=dp[u][i][0][0],dp[u][i][0][0]=0;tmp[i][0][1]=dp[u][i][0][1],dp[u][i][0][1]=0;tmp[i][1][0]=dp[u][i][1][0],dp[u][i][1][0]=0;tmp[i][1][1]=dp[u][i][1][1],dp[u][i][1][1]=0;}for(int i=0;i<=min(siz[u],k);++i)for(int j=0;j<=min(siz[v],k-i);++j){add(dp[u][i+j][0][0],(ll)tmp[i][0][0]*dp[v][j][0][1]%MOD);add(dp[u][i+j][1][0],(ll)tmp[i][1][0]*(((ll)dp[v][j][0][0]+dp[v][j][0][1])%MOD)%MOD);add(dp[u][i+j][0][1],((ll)tmp[i][0][1]*(((ll)dp[v][j][0][1]+dp[v][j][1][1])%MOD)%MOD+(ll)tmp[i][0][0]*dp[v][j][1][1]%MOD)%MOD);add(dp[u][i+j][1][1],((ll)tmp[i][1][0]*(((ll)dp[v][j][1][0]+dp[v][j][1][1])%MOD)%MOD+(ll)tmp[i][1][1]*(((ll)dp[v][j][0][0]+dp[v][j][0][1]+dp[v][j][1][0]+dp[v][j][1][1])%MOD)%MOD)%MOD);}siz[u]+=siz[v];}
}int main(){n=read(),k=read();for(int i=1,u,v;i<n;++i){u=read(),v=read();addedge(u,v),addedge(v,u);}dfs(1,0);write((dp[1][k][0][1]+dp[1][k][1][1])%MOD);return fw,0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

计量经济学(六)——时间序列滞后变量模型

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 滞后变量模型(Lagged Variable Models)是一种时间序列分析方法,主要通过引入自变量和因变量的滞后项来解释当前变量的行为。该模型在经济学、金融学中广泛…

Krita配置comfyui,ai绘图 记录

comfyui使用b站up、赛博佛祖秋葉aaaki的整合包。此地址下载ai插件 https://github.com/Acly/krita-ai-diffusion krita中安装下载好的插件,从文件导入python插件 打开ai绘图面板: 缺失节点使用复制链接地址 然后,在复制的地址后加上.git 后使用comfy UI manager通过git URL安…

ABP VNext 系列:框架启动流程以及依赖注入原理和源码分析

简单介绍 ABP VNext Github 地址:https://github.com/abpframework/abp 官网文档地址:https://abp.io/docs/latest 官网:https://abp.io/ABP VNext 框架是一个基于 ASP.NET Core 的完整基础架构,也就是我们现在称的 ABP 框架,它遵循软件开发最佳实践和最新技术来创建现代 …

IDEA如何查看所有的断点(Breakpoints)并关闭

前言 我们在使用IDEA开发Java应用时,基本上都需要进行打断点的操作,这方便我们排查BUG,也方便我们查看设计的是否正确。不过有时候,我们不希望进入断点,这时候除了点击断点关闭外,有没有更快速的方便关闭所有的断点呢? 如何设置 首先,我们在运行debug模式的时候,切换到…

为什么普通AI不够用?定制AI Agents工具是关键!

1 新建一个实时搜索工具 @tool def web_search(query: str):""" 实时搜索工具 """serp = SerpAPIWrapper()result = serp.run(query)print("实时搜索结果:", result)return result# 初始化工具列表 tools = [web_search]# 创建OpenAI工…

Nginx UI:全新的 Nginx 在线管理平台

前言 Nginx在程序部署中扮演着至关重要的角色,其高性能、高安全性、易于配置和管理的特点,使得它成为现代Web应用部署中不可或缺的一部分。今天大姚给大家分享一款实用的 Nginx Web UI 工具,希望能够帮助到有需要的同学。 工具介绍 Nginx UI一个功能丰富、易于使用的 Nginx …

LSTM神经网络结合PSO粒子群优化对管网优化调度及网络安全入侵检测模型|附数据代码

全文链接:https://tecdat.cn/?p=37878 原文出处:拓端数据部落公众号 分析师:Fan Qiao 在当今科技飞速发展的时代,无论是工业生产中的管网系统,还是信息领域的网络安全,都面临着日益复杂的挑战😕。管网系统作为能源输送和分配的关键基础设施,其优化调度对于提高能源利…

【专题】2024年经销商车后用户研究:洞察车主变化制胜售后未来报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37875 在汽车行业快速变革的时代,“互联网原住民”成为车主群体的重要组成部分。2023 - 2024 年,车后用户线上渠道使用比例不断上升,App/小程序备受青睐,各线上渠道各具优势。同时,购车关注点也在不断变化,价格成为关键因素,本土品牌崛…