题解[HEOI2013]SAO.md
题意
给定一棵树,边有方向。要给点重标号,使得边都由小编号指向大编号,求重标号方案数。
\(n\le10^5\)
思路
有关树的计数。套路性考虑树形 DP。
设计状态 \(f_{u}\) 表示 \(u\) 的子树的合法重标号方案数。如何转移?发现不好转移。
考虑什么情况下可以转移呢?发现转移是合并当前 \(u\) 子树中已经考虑了部分的状态和其某还未考虑的儿子 \(v\) 的子树的状态,而转移合法只要保证 \(u\) 和 \(v\) 在重标号中相对大小关系符合边上的限制。那么我们考虑改状态为 \(f_{u,i}\) 表示 \(u\) 的子树重标号且 \(u\) 的新编号为 \(i\) 的方案数。如何转移?
大于和小于的情况是对称的,所以我们只讨论 \(u\) 的新编号要小于 \(v\) 的情况,另一种情况的转移类似。我们考虑状态 \(f_{u,i}\) 能转移到什么状态。考虑在新的重标号方案中,在 \(v\) 的子树中拿 \(j\) 个点标上小于 \(i+j\) 的编号,\(u\) 标上编号 \(i+j\),那么考虑转移方程中需要哪些系数呢?首先,考虑 \(f_{u,i}\) 能与哪些 \(f_{v,k}\) 合并得到新的状态,发现 \(v\) 子树中前新编号前 \(j\) 小的点都拥有小于 \(i\) 的新编号,而 \(v\) 的新编号不能小于 \(u\),所以要保证 \(k>j\),也就说这次转移中合法的 \(v\) 的子树重编号方案数是 \(\sum\limits_{k=j+1}^{siz_v}f_{v,k}\)。其他系数?要在 \(i+j-1\) 个新编号小于 \(i+j\) 的点中选 \(j\) 个点来自 \(v\) 的子树,这里需要乘上 \(\binom{i+j-1}{j}\)。新编号大于 \(i+j\) 的同理,乘上 \(\binom{siz_u+siz_v-i-j}{siz_v-j}\)。总的式子就是 \(f_{u,i+j}+=\binom{i+j-1}{j}\binom{siz_u+siz_v-i-j}{siz_v-j}f_{u,i}\sum\limits_{k=j+1}^{siz_v}f_{v,k}\)。发现前缀和可以优化掉那个 \(\sum\)。统计答案就是 \(\sum\limits_{i=1}^nf_{1,i}\)。
计算一下复杂度,看似是 \(O(n^3)\)?每次合并复杂度为 \(siz_u\times siz_v\),这与树形背包是一样的复杂度,所以总复杂度应该是 \(O(n^2)\)。可以理解为 \(u\) 子树中已考虑的每个点和 \(v\) 子树中每个点都 \(O(1)\) 计算一次,发现每对点都只会在其 LCA 处计算一次,所以总复杂度是点对数即 \(O(n^2)\)。
实现
void DP(int u,int fa){
sz[u]=1;
for(int i=1;i<=n;++i)
f[u][i]=0;
f[u][1]=1;
for(int ie=head[u],v=e[ie].t;ie;ie=e[ie].n,v=e[ie].t)
if(v!=fa){
DP(v,u);
for(int i=1;i<=sz[u]+sz[v];++i)
tmp[i]=0;
if(e[ie].op)
for(int i=1;i<=sz[u];++i)
for(int j=1;j<=sz[v];++j)
MAdd(tmp[i+j-1],Mul(Mul(Add(g[v][sz[v]],MOD-g[v][j-1]),f[u][i]),Mul(C(i+j-2,j-1),C(sz[u]-i+sz[v]-j+1,sz[v]-j+1))));
else
for(int i=1;i<=sz[u];++i)
for(int j=1;j<=sz[v];++j)
MAdd(tmp[i+j],Mul(Mul(g[v][j],f[u][i]),Mul(C(i+j-1,j),C(sz[u]-i+sz[v]-j,sz[v]-j))));
sz[u]+=sz[v];
for(int i=1;i<=sz[u];++i)
f[u][i]=tmp[i];
}
for(int i=1;i<=sz[u];++i)
g[u][i]=Add(g[u][i-1],f[u][i]);
}
题解[HEOI2013]SAO.md的更多相关文章
- 【BZOJ3167】[HEOI2013]SAO(动态规划)
[BZOJ3167][HEOI2013]SAO(动态规划) 题面 BZOJ 洛谷 题解 显然限制条件是一个\(DAG\)(不考虑边的方向的话就是一棵树了). 那么考虑树型\(dp\),设\(f[i][ ...
- P4099 [HEOI2013]SAO
P4099 [HEOI2013]SAO 贼板子有意思的一个题---我()竟然没看题解 有一张连成树的有向图,球拓扑序数量. 树形dp,设\(f[i][j]\)表示\(i\)在子树中\(i\)拓扑序上排 ...
- BZOJ 3167: [Heoi2013]Sao
3167: [Heoi2013]Sao Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 96 Solved: 36[Submit][Status][D ...
- 【BZOJ3167/4824】[Heoi2013]Sao/[Cqoi2017]老C的键盘
[BZOJ3167][Heoi2013]Sao Description WelcometoSAO(StrangeandAbnormalOnline).这是一个VRMMORPG,含有n个关卡.但是,挑战 ...
- 【做题记录】 [HEOI2013]SAO
P4099 [HEOI2013]SAO 类型:树形 \(\text{DP}\) 这里主要补充一下 \(O(n^3)\) 的 \(\text{DP}\) 优化的过程,基础转移方程推导可以参考其他巨佬的博 ...
- 3167: [Heoi2013]Sao [树形DP]
3167: [Heoi2013]Sao 题意: n个点的"有向"树,求拓扑排序方案数 Welcome to Sword Art Online!!! 一开始想错了...没有考虑一个点 ...
- P4099 [HEOI2013]SAO(树形dp)
P4099 [HEOI2013]SAO 我们设$f[u][k]$表示以拓扑序编号为$k$的点$u$,以$u$为根的子树中的元素所组成的序列方案数 蓝后我们在找一个以$v$为根的子树. 我们的任务就是在 ...
- [HEOI2013]SAO(树上dp,计数)
[HEOI2013]SAO (这写了一个晚上QAQ,可能是我太蠢了吧.) 题目说只有\(n-1\)条边,然而每个点又相互联系.说明它的结构是一个类似树的结构,但是是有向边连接的,题目问的是方案个数,那 ...
- [HEOI2013]SAO ——计数问题
题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
- [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
随机推荐
- Java基础学习笔记-流程控制
Java程序结构 顺序结构 分支选择结构 循环结构 顺序结构 分支选择结构 if-else Switch case Switch case 注意点 要配合break,要不就会一直往下走 case 值必 ...
- Xmake v2.7.6 发布,新增 Verilog 和 C++ Modules 分发支持
Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...
- java入门与进阶P-2.3
判断 if语句 一个基本的if语句由一个关键字if开头,跟上在括号里的表示条件的逻辑表达式, 然后是一对大括号"{}"之间的若干条语句.如果表示条件的逻辑表达式的结果为true,那 ...
- 读Java8函数式编程笔记03_高级集合类和收集器
1. 方法引用 1.1. 一种引用方法的轻量级语法 1.1.1. 提供了一种简短的语法 1.1.2. 标准语法为Classname::methodName 1.2. 凡是使用Lambda表达式的地方, ...
- JDK8 四大核心函数式接口及扩展接口总结
前言 Java8的四大函数式接口及相关的扩展接口在日常使用中的频率也是非常多的,包括自己定义的函数式接口,在JDK1.8之前,我们定义的方法都是用来接收参数,然后自己根据参数传递实现逻辑.在1.8之后 ...
- activemq插件在eos中的开发
ActiceMQ-CPP消息插件是CMS的一种实现,是一个能够与ActiveMQ进行通信的C++客户端库,ActiveMQ-CPP的架构设计能够支持可插拨的传输协议和消息封装格式,并且支持客户端容量, ...
- idea2022.2.3安装破解
转:https://www.quanxiaoha.com/article/idea-pojie.html 1 注意事项 如果是卸载了旧版本安装的本版本,安装完成后打不开,可能是旧版本的影响 找到:C: ...
- Python3中的“加和”函数
技术背景 其实如果没有专门去研究python的一些内置函数的话,我们都没办法发现一些很神奇的功能,即使是我们最熟悉的python中的sum函数.不知道还有多少人,以为这只是一个只能用来做求和的函数? ...
- Idea的jdbc中的查询与增删该
在上一篇的折磨中 终于写好了代码 来总结一下其中的奥妙 (相同部分:)1.有mysql并且与主机建立连接 2.有jar包并且复制到自己创建的libs文件下,右键add 3.需要写main方法 4.需要 ...
- 安装和配置Maven项目管理工具
1.下载Maven工具包:https://maven.apache.org/download.cgi 2.解压apache-maven-3.8.4-bin.zip 3.修改apache-maven-3 ...