首页 > 其他分享 >SS241126C. 树(tree)

SS241126C. 树(tree)

时间:2024-11-26 21:34:04浏览次数:7  
标签:结点 SS241126C tree times 枚举 cases gets col

SS241126C. 树(tree)

题意

给你一个以 \(1\) 为根的树,每个点有点权 \(v_i\)。设这棵树的点集为 \(V\),一个合法的子集 \(V' \subseteq V\),满足存在 \(p \in V'\),使得 \(V'\) 中任意两点的 LCA 都是 \(p\)。

把 \(V\) 分成若干个 \(V'\) 称为一种划分方案,一种划分方案 \(\{ V' \}\) 的价值为 \(\prod_{\{V'\}} (\sum_{i \in V'} v_i)\)。求所有合法发划分方案的价值和。答案对输入的 \(mod\) 取模。

\(n \le 100\)。

思路

黄队讲得非常仔细,可惜我太菜了。

不保证过程正确,如有误欢迎指出/bx


考虑刻画合法 \(V'\)。发现其形如有一个点 \(p\) 是 \(V'\) 中深度最浅的点,我们把它叫做集合的头,然后 \(p\) 的每棵子树里,可以选择至多 \(1\) 个点加入集合。


考虑先解决一个简单的问题,计算合法划分方案数。

考虑树形 DP,从下往上转移。要计算加入点 \(u\) 的贡献,分 \(u\) 是一个集合的头,或者是集合的一般结点来讨论。如果 \(u\) 是一个集合的头,那么 \(u\) 的每棵子树都可以选择一个或者不选点加入 \(u\) 的集合;如果 \(u\) 是一般结点,那么我们先不算贡献,把它的贡献留到处理头结点时去计算。

设 \(f_{u,s,0/1}\) 表示处理到点 \(u\),点 \(u\) 的子树里一共有多少个一般结点未被使用,点 \(u\) 是/不是头结点,的划分方案数。答案是 \(f_{1,0,1}\)。

对于 \(u\) 是头结点的情况。枚举 \(u\) 的儿子 \(v\),枚举 \(v\) 的子树有多少个未被使用的一般结点,枚举在 \(v\) 的子树中选择一个一般结点加入 \(u\) 的集合还是不选。

转移复杂度是 \(siz_u\)。注意枚举每个 \(v\) 要把上一个 \(v\) 时计算的 \(f_u\) 覆盖掉,注意转移顺序应该是 \(j\) 从大往小枚举。初始 \(f_{u,0,1}=1\)。

\[(v \in son_u) \\ \begin{aligned} f_{u,s+j,1} & \gets f_{u,s,1} \times f_{v,j}\\ f_{u,s+j-1,1} & \gets f_{u,s,1} \times j \times f_{v,j} \end{aligned} \]

对于 \(u\) 是一般结点的情况,仍然枚举 \(u\) 的儿子 \(v\),枚举 \(v\) 的子树有多少个没有被使用的一般结点。初始 \(f_{u,1,0}=1\)。

\[(v \in son_u)\\ f_{u,s+j+1,0} \gets f_{u,s,0} \times f_{v,j} \]

应该是这样的吧。时间是 \(O(n^2)\)。


求原问题。

考虑展开那一坨连乘,相当于在每个集合里选择一个点涂黑,然后贡献是黑点点权的乘积,对每种涂色方案的贡献求和。即

\[\sum_{\{ V' \} } \sum_{\{col\}} \prod_{col_u = 1} v_u \]

仍然考虑从下往上树形 DP。考虑加入点 \(u\) 带来的影响。

\[\begin{cases} u 是头结点 \begin{cases} col_u = 1 \Rightarrow [v 子树不选点/选一个白点]\\ col_u = 0 \Rightarrow [v 子树不选点/选一个点]\cup [至少一个 v 子树选择了黑点] \end{cases}\\ u 是一般结点 \begin{cases} \begin{rcases} col_u = 1 \\ col_u = 0 \end{rcases} 留到头结点再处理 \end{cases} \end{cases} \]

设 \(f_{u,s_0,s_1,0/1}\) 表示子树 \(u\) 有 \(s_0\) 个未被使用的白点,有 \(s_1\) 个未被使用的黑点,点 \(u\) 是头结点,集合里有没有黑点,的方案的价值之和。\(g_{u,s_0,s_1}\) 表示 \(u\) 是一般结点的答案。

初值 \(f_{u,0,0,0}=1,f_{u,0,0,1}=v_u,g_{u,1,0}=1,g_{u,0,1}=v_u\)。

\[\begin{aligned} f_{u,s_0+x,s_1+y,1} & \gets f_{u,s_0,s_1,1} \times (f_{v,x,y}+g_{v,x,y})\\ f_{u,s_0+x-1,s_1+y,1} & \gets f_{u,s_0,s_1,1} \times (f_{v,x,y}+g_{v,x,y}) \times x\\ f_{u,s_0+x,s_1+y,0} & \gets f_{u,s_0,s_1,0} \times (f_{v,x,y}+g_{v,x,y})\\ f_{u,s_0+x-1,s_1+y,0} & \gets f_{u,s_0,s_1,0} \times (f_{v,x,y}+g_{v,x,y}) \times x\\ f_{u,s_0+x,s_1+y-1,1} & \gets f_{u,s_0,s_1,0} \times (f_{v,x,y}+g_{v,x,y}) \times y\\ g_{u,s_0+x,s_1+y} & \gets g_{u,s_0,s_1} \times (f_{v,x,y}+g_{v,x,y}) \end{aligned} \]

应该就是这些了吧。

答案就是 \(f_{1,0,0,1}\)。

code

应该不会太难写。

标签:结点,SS241126C,tree,times,枚举,cases,gets,col
From: https://www.cnblogs.com/liyixin0514/p/18571024

相关文章

  • Anji‘s Binary Tree(Round 911)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();constintinf=0x3f3f3f3f;signedmain(){#ifdefGordenfreopen("in.txt&q......
  • 理解 树摇tree-shaking
    treeshaking树摇TreeShaking指基于ESModule进行静态分析,通过AST将用不到的函数进行移除,从而减小打包体积。1前置知识webpack打包产物js文件夹下主要分为三个主要模块(css其实也同理)打包工具将node_modules里的三方库压缩合并成一个单独的bundle,位置js/chunk-......
  • 【C++笔记】数据结构进阶之二叉搜索树(BSTree)
    【C++笔记】数据结构进阶之二叉搜索树(BSTree)......
  • CF1404B. Tree Tag
    1405D-树标记让我们独立地考虑几个情况。情况1:$\text{dist}(a,b)\leqda$不出所料,在这种情况下,Alice在第一步就通过标记Bob获胜。情况2:$2da\geq\text{树的直径}$在这里,树的直径被定义为最长简单路径的长度。在这种情况下,Alice可以移动到树的中心。一旦Alice......
  • 最小生成树(Minimum Spanning Tree,MST)初步
    定义连通图的最小生成树(MinimumSpanningTree,MST)为边权和最小的生成树。注意:只有连通图才有生成树,而对于非连通图,只存在生成森林。思路分为Kruskal与Prim两种算法。Kruskal从最小边权的边开始,按边权从小到大依次遍历。若当前边连接的两点不连通,加入此边。Prim每次选......
  • AntDesign树形组件tree和输入input组件融合使用
    <a-tree :tree-data="selectItem.options.options" :replace-fields="{ children:'children', title:'label', code:'code' }" >......
  • Map集合中的具体子类TreeMap
    一、TreeMap元素是一个键值对,可以去重并进行排序1.先编写一个Dog2类publicclassDog2{privateStringname;privateintage;publicDog2(){}publicDog2(Stringname,intage){this.name=name;......
  • Java中的Iterator接口,以及HashSet和TreeSet
    在Java编程中,`Iterator`接口是一个非常重要的概念,它为我们提供了一种统一且方便的方式来遍历集合(如`List`、`Set`、`Map`等数据结构中的元素,不过遍历`Map`时稍显特殊,通常是遍历其键值对的集合视图)。##一、Iterator接口的定义与方法`Iterator`接口位于`java.util`包中,它定义......
  • ORB-SLAM2 ---- ORBextractor::ComputeKeyPointsOctTree
    文章目录一、函数作用二、源码及注释三、函数的讲解1.遍历金字塔的每一层,将其分成30*30的网格单元,并给每一层添加图像边界2.遍历每个单元格,提取特征点3.调用DistributeOctTree()函数分配特征点4.计算所有保留下来的特征点的方向信息一、函数作用ORB-SLAM2----......
  • 力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树
    之前发过一篇,感觉还有深挖的地方,于是又补充一些信息这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度题解1可以帮助复习线段树的使用,题解2可以复习一下java基础知识题解1线段树这是自己憋出来的线段树classSeatManager{......