题意

给定一棵树,边有方向。要给点重标号,使得边都由小编号指向大编号,求重标号方案数。

\(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的更多相关文章

  1. 【BZOJ3167】[HEOI2013]SAO(动态规划)

    [BZOJ3167][HEOI2013]SAO(动态规划) 题面 BZOJ 洛谷 题解 显然限制条件是一个\(DAG\)(不考虑边的方向的话就是一棵树了). 那么考虑树型\(dp\),设\(f[i][ ...

  2. P4099 [HEOI2013]SAO

    P4099 [HEOI2013]SAO 贼板子有意思的一个题---我()竟然没看题解 有一张连成树的有向图,球拓扑序数量. 树形dp,设\(f[i][j]\)表示\(i\)在子树中\(i\)拓扑序上排 ...

  3. BZOJ 3167: [Heoi2013]Sao

    3167: [Heoi2013]Sao Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 96  Solved: 36[Submit][Status][D ...

  4. 【BZOJ3167/4824】[Heoi2013]Sao/[Cqoi2017]老C的键盘

    [BZOJ3167][Heoi2013]Sao Description WelcometoSAO(StrangeandAbnormalOnline).这是一个VRMMORPG,含有n个关卡.但是,挑战 ...

  5. 【做题记录】 [HEOI2013]SAO

    P4099 [HEOI2013]SAO 类型:树形 \(\text{DP}\) 这里主要补充一下 \(O(n^3)\) 的 \(\text{DP}\) 优化的过程,基础转移方程推导可以参考其他巨佬的博 ...

  6. 3167: [Heoi2013]Sao [树形DP]

    3167: [Heoi2013]Sao 题意: n个点的"有向"树,求拓扑排序方案数 Welcome to Sword Art Online!!! 一开始想错了...没有考虑一个点 ...

  7. P4099 [HEOI2013]SAO(树形dp)

    P4099 [HEOI2013]SAO 我们设$f[u][k]$表示以拓扑序编号为$k$的点$u$,以$u$为根的子树中的元素所组成的序列方案数 蓝后我们在找一个以$v$为根的子树. 我们的任务就是在 ...

  8. [HEOI2013]SAO(树上dp,计数)

    [HEOI2013]SAO (这写了一个晚上QAQ,可能是我太蠢了吧.) 题目说只有\(n-1\)条边,然而每个点又相互联系.说明它的结构是一个类似树的结构,但是是有向边连接的,题目问的是方案个数,那 ...

  9. [HEOI2013]SAO ——计数问题

    题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

  10. [BZOJ3167][P4099][HEOI2013]SAO(树形DP)

    题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

随机推荐

  1. angular---angular路由守卫,有的可以访问有的不可以访问,有的路由地址只有在满足条件时候访问,其它禁止访问,

  2. 看不懂打我系列------图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用

    @图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用 简体中文 | English 说明 本文介绍如何在CentOS Linux ...

  3. Java 进阶P-11+P-12

    文本流 在流上建立文本处理 PrintWriter pw = new PrintWriter()( new BufferedWriter( new Out put StreamWriter( new ...

  4. Longbow.Tasks

    Longbow.Tasks 概述 大体分为了Scheduler(调度任务),Storage(持久化),Trigger(触发器),Task(任务)和逻辑模块,大体流程为通过逻辑代码进行实例化相关类,根据 ...

  5. 一文搞懂工作流审批(Java+activiti)快速开发+自定义工作流配置

    前言 activiti工作流引擎项目,企业erp.oa.hr.crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求. 一.项目形式 springboot+v ...

  6. Gateway服务网关 (入门到使用)

    Gateway服务网关 Gateway也要作为微服务注册到nacos中 Zuul也是网关但比较老是一种阻塞式编程:Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 ...

  7. day08-SpringMVC底层机制简单实现-04

    SpringMVC底层机制简单实现-04 https://github.com/liyuelian/springmvc-demo.git 8.任务7-完成简单视图解析 功能说明:通过目标方法返回的 S ...

  8. Creo9.0 安装破解图文教程 【2022年12月29日亲测有效】

    前言 creo9.0正式版是一款非常优秀的3D建模设计软件.该软件界面美观,提供了CAD 技术.模制造绘图.多实体建模.多体设计.实时仿真.框架和焊缝设计等一系列强大的辅助设计功能,通过这些功能,让用 ...

  9. Hangfire .NET任务调度框架实例

    1.介绍 Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台(后台任务调度面板),可以直观明了的查看作业调度情况. 2.Nuget安装 3.编写代码 1)测试服务:FirstS ...

  10. Json.stringfiy json未定义

    在文档的顶部添加 <!DOCTYPE html> 没有它,IE10是一个奇怪的兼容模式,许多"新"功能不可用,例如JSON.如果你任然需要使用早期版本的IE,你可以使用 ...