题意

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

\(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. 区块链特辑——solidity语言基础(七)

    Solidity语法基础学习 十.实战项目(二): 3.项目实操: ERC20 代币实战 ①转账篇 总发行量函数 totalSupply() return(uint256) ·回传代币的发行总量 ·使 ...

  2. Java基础学习笔记-类的静态属性和静态方法--待继续补充

    程序运行时的内存占用 代码区(code area) 存放代码 数据区(data area) 存放全局数据.静态数据 堆区(heap area) 存放动态申请的数据 栈区(stack area) 存放局 ...

  3. 图书管理系统BMS

    图书管理系统BMS 效果图: 主要代码: 表关系的创建: from django.db import models # Create your models here. class Book(mode ...

  4. Java 进阶P-6.4+P-6.5

    狐狸和兔子 狐狸和兔子都有年龄 当年龄到了一定的上限就会自然死亡 狐狸可以随即决定在周围的兔子中吃一个 狐狸和兔子可以随即决定生一个小的,放在旁边的空的格子里 如果不吃也不生,狐狸和兔子可以随机决定走 ...

  5. Docker不做虚拟化内核,对.NET有什么影响?

    引子 前两天刷抖音,看见了这样一个问题. 问题:容器化不做虚拟内核,会有什么弊端?Java很多方法会跟CPU的核数有关,这个时候调用系统函数,读到的是宿主机信息,而不是我们限制资源的大小. 思考:在我 ...

  6. 力扣---1137. 第 N 个泰波那契数

    泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契 ...

  7. JAVA虚拟机03-常量池项中字面量和符号引用

    转https://baijiahao.baidu.com/s?id=1682261792528500739&wfr=spider&for=pc 1 符号引用 符号引用以一组符号来描述所 ...

  8. SpringCloud Sleuth链路追踪

    1.概要 一般的,一个分布式服务跟踪系统,主要有三部分: 数据收集 数据存储 数据展示 然而这三个部分其实不都是由SpringCloud Sleuth(下面我简称为Sleuth)完成的,Sleuth负 ...

  9. 微信小程序组件封装传值以及问题点规避

    封装组件 1.在components文件加下新建组件文件夹,在该文件夹下新建组件 2.在app.json中注册该组件 "usingComponents": { "page ...

  10. JZOJ 2020.01.11【NOIP提高组】模拟B组

    2020.01.11[NOIP提高组]模拟B组 今天的题是不是和 \(C\) 组放错了? 呵呵 然,却只有 \(300\) 分 首先,\(T4\) 看错题了 后,一时想不到正解 讨论区,一看,三个字- ...