首页 > 其他分享 >CF1010F 与 ABC269H:有多少个包含根的连通块?

CF1010F 与 ABC269H:有多少个包含根的连通块?

时间:2024-11-21 19:57:18浏览次数:1  
标签:连通 ABC269H log sum cdots CF1010F 重链 复杂度 dp

CF 传送门

AT 传送门

两题主要 Trick 相同。CF 的还多了一个小 trick。


给定一棵根节点为 \(1\) 的二叉树 \(T\),你需要先保留一个包含 \(1\) 号节点的连通块,然后给每个点确定一个权值 \(a_i\),使得对于每个点 \(u\) 都有其权值 \(a_u\) 大于等于其所有儿子的权值和 \(\sum a_v[(u,v)\in T]\)。

最后,你需要使得根节点权值为 \(x\),求方案数,答案对 \(998244353\) 取模。

\(n\le 10^5,x\le 10^{18}\).

即 \(a_u-\sum_{v\in son(u)}a_v\ge 0\),令 \(b_u=a_u-\sum_{v\in son(u)}a_v\),即 \(b_u\ge 0\)。注意到 \(\sum b_u=x\),且 \(\{a_i\}\) 与 \(\{b_i\}\) 一一对应,所以分配 \(a_i\) 相当于分配 \(b_i\)。而如果选了固定 \(k\) 个点,分配 \(b_i\) 就是把 \(x\) 分给 \(k\) 个数,每个数 \(\ge 0\)。这是经典结论,有 \(\binom{x+k-1}{k}\) 种分配方式。

于是下面的问题就是对于每个 \(k=1\sim n\),求出有多少个 \(k\) 大小的包含 \(1\) 的连通块。

法一:普通树形 DP。\(dp[i][j]\) 表示在 \(i\) 的子树内选 \(j\) 个点的方案数。转移方程 \(dp[i][j]\leftarrow dp[i][j]+\sum_{v\in son(i),k<j}dp[i][k]\cdot dp[v][j-k]\)。因为每一对点的复杂度在其 LCA 处贡献 \(O(1)\) 次,复杂度是 \(O(n^2)\) 的。

法二:dfs 序 DP。\(dp[i][j]\) 表示考虑 dfs 序 \(<i\) 的结点选不选,共选了 \(j\) 个的方案数。转移方程 \(dp[i][j]\rightarrow dp[i+1][j+1]\),\(dp[i][j]\rightarrow dp[mx_i+1][j]\)。复杂度 \(O(n^2)\)。

法三:FFT + 树剖优化法一。注意到法一 \(\sum dp[i][k]\cdot dp[v][j-k]\) 的形式是卷积,考虑使用 FFT 优化。转移方程为 \(F(u)=x\cdot F(son_1)\cdot F(son_2)+1\)。

但是直接上复杂度是 \(O(n^2\log n)\) 的,因为两个式子卷积 \(O(len\log len)\),所以每一对点贡献的复杂度变成 \(O(\log n)\) 了。

难道这个做法没有用吗?不,我们还有办法!上面做法的问题在于每个点会被使用太多次了。有什么办法是让一个点出现次数变少的?

树剖!我们进行重链剖分,仅在重链链顶处统计重链上所有的点和轻儿子的贡献。

如图。在重链链顶 \(u_1\) 处计算 \(F(u_1)\),可以一路分解下去到轻儿子。记相关的多项式为 \(a_1\sim a_4\),要求的形式即为 \(1+a_1+a_1a_2+a_1a_2a_3+a_1a_2a_3a_4\),而 \(a_i\) 的大小之和是 \(O(n)\) 的。这种形式可以用分治 FFT 计算。

具体而言,我们在计算 \(a_1+\cdots +a_1\cdots a_n\) 时,先递归计算 \(a_1+\cdots+a_1\cdots a_{n/2}\) 和 \(a_{n/2+1}+\cdots+a_{n/2+1}\cdots a_n\) 部分。同时让这两部分额外返回 \(a_1\cdots a_{n/2}\) 和 \(a_{n/2+1}\cdots a_n\) 的值,则当前结果即为 \(a_1+\cdots+a_1\cdots a_{n/2} + a_1\cdots a_{n/2}(a_{n/2+1}+\cdots+a_{n/2+1}\cdots a_n)\),用一次多项式加法和一次多项式乘法可以 \(O(n\log n)\) 做到。

分治 \(O(\log n)\) 层,每层 \(O(n\log n)\) 合并。所以计算重链链顶多项式的复杂度是 \(O(nlog^2n)\) 的。(这里的 \(n\) 是所在重链轻子树大小之和)

所以一个结点在作为轻儿子时会贡献 \(O(log^2)\) 的复杂度,每个结点贡献 \(O(\log n)\) 次,总复杂度 \(O(n\log^3 n)\)。

标签:连通,ABC269H,log,sum,cdots,CF1010F,重链,复杂度,dp
From: https://www.cnblogs.com/FLY-lai/p/18561370

相关文章

  • 第二次网络渗透测试课程实验--使用Ping指令测试网络连通性
    首先,我们需要知道目的计算机的ip,才能执行ping指令。那么如何得到设备的ip呢?在本机,可以调出控制台面板,然后输入ipconfig指令,即可获得本机的ip地址、默认网关、子网掩码等信息。在虚拟机中,打开控制台面板,然后输入ifconfig指令即可得到虚拟机的ip、MAC地址等信息。得到目的设备......
  • 双连通分量学习笔记+杂题
    图论系列:前言:もしも明日がくるのならあなたと花を育てたいもしも明日がくるのならあなたと愛を語りたい走って笑って転んで相关题单:https://www.luogu.com.cn/training/641352一.割点与桥双连通分量是针对无向图来说的,有向图是强连通分量。在了解双连通分量之前需要先......
  • 【笔记/模板】无向图的双连通分量
    边双连通分量定义在一张联通的无向图中,对于任意两点\(u\)和\(v\)​,删去两点之间任意一条边,都无法使其不连通(即连通数不变),我们就说这两点是边双连通。对于一个无向图中的极大边双连通的子图,我们称这个子图为一个边双连通分量。根据【笔记/模板】割点和桥中可知,如果......
  • 强连通分量学习笔记+杂题
    图论系列:前言:僕は明快さ故にアイロニー優柔不断なフォローミー後悔後悔夜の果て相关题单:戳我一.强连通分量相关定义基本摘自oiwiki,相关定义还是需要了解。(实际就是搬了个oiwiki)强连通分量主要在研究有向图可达性,针对的图类型为有向弱联通图。1.强连通定义强连通:对......
  • 基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据
    时间序列数据表示了一个随时间记录的值的序列。理解这些序列内部的关系,尤其是在多元或复杂的时间序列数据中,不仅仅局限于随时间绘制数据点(这并不是说这种做法不好)。通过将时间序列数据转换为图,我们可以揭示数据片段内部隐藏的连接、模式和关系,帮助我们发现平稳性和时间连通......
  • Tarjan连通性算法模板大整合
    更新日志前言由于Tarjan算法页面过多,这里统一做一个整合,后期可能还会加入或者更改这里的模板。另外的,这个页面只提供模板——以及链接,详细讲解点链接即可。强连通(有向图,储存每个节点属于的分量编号)intscnt;intscc[N],siz[N];intdcnt;intdfn[N],low[N];boolins[N......
  • Tarjan求点双连通分量
    更新日志思路首先,点双连通分量就是删去任意一点后仍连通的分量。如何求呢?看着定义,答案就已经在里面了——求出割点即可。与边双不同的是,点双中是包括割点的。究其原因,删去割点之后,原图会被分成多个连通块,但事实上,割点加入其中任意一个,仍然是双连通的。证明如下:若连通块......
  • 连通性相关
    强连通强连通:有向图\(G\)中每个点中可互相到达。强连通分量:极大的强连通。(最大可能的)求强连通分量先跑出图的DFS搜索树(黑边)。一个结论:一个强连通分量一定在该强连通分量中的第一个被访问的点的子树内。设根为\(u\),考虑若存在一个点\(v\)不在\(u\)子树中则一定存......
  • 插头 dp / 轮廓线 dp / 连通性 dp 做题笔记
    牢游看见我正在做插头dp,于是给我了一个Claris的连通性dp的pdf。好了,现在又有可以软性颓废的事可干了。好多题目在其他平台都找不到了,这时候我们becoder的优越性就体现出来了!(这就是到处搬题的好处)所以大部分题目链接都会放becoder的链接。什么?你不知道becoder或者没......
  • 「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)
    目录概述成员变量创建销毁根节点访问路径压缩启发式合并复杂度Code概述并查集,故名思议,能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。这是一个什么数据结构呢?一般来讲,并查集是由一系列集合组成的集合群。其中,每个集合都有一个根节点,它的......