首页 > 其他分享 >[ARC171C] Swap on Tree

[ARC171C] Swap on Tree

时间:2024-09-04 16:14:47浏览次数:4  
标签:ARC171C return int sum Tree solve Swap mathcal

My Blogs

[ARC171C] Swap on Tree

科技改变生活。以 6ms 的速度拿下了目前最优解(

如果已经确定了 \(u\) 的一个儿子 \(v\) 内部的操作顺序,考虑在某个时刻交换 \((u,v)\)。设 \(a[1,k]\) 是操作 \(v\) 子树内部时 \(v\) 上面的颜色,可以发现在第 \(i\) 个时刻交换和在第 \(j\) 个时刻交换,方案本质不同的充要条件是 \(a_i\not= a_j\)。

考虑 \(i\) 和 \(i\) 的所有儿子,如果选择了 \(S\) 作为要与 \(i\) 交换的子树集合,则权值是 \(|S|!\prod_{i\in S}(\sum_j jf_{i,j})\prod_{i\notin S}(\sum_j f_{i,j})\),其中 \(f_{i,j}\) 表示 \(i\) 子树内颜色改变次数是 \(j\) 的方案数。\(|S|!\) 是因为在确定 \(i\) 和集合内所有点的操作顺序,\(jf_{i,j}\) 是因为对于在集合里的点有颜色切换次数个本质不同的交换方案。

暴力做是 \(\mathcal O(n^2)\) 的。设 \(g_{i,0}=\sum_i f_{x,i},g_{i,1}=\sum_i if_{x,i}\)。设多项式 \(F_u(x)=g_{u,0}+g_{u,1}x\),则 \(f_{u,k+1}\) 即为 \(k![x^k]\prod_{v\in\text{son}(u)}F_v(x)\)。

注意到要乘的多项式的总个数是 \(\mathcal O(n)\) 的,所以可以用你喜欢的方法比如分治 NTT 或者先 ln 再 exp 做到 \(\mathcal O(n\log^2 n)\) 或者 \(\mathcal O(n\log n)\)。

int n,fr[200010],g[200010][2];
vi T[200010];
vp F;
vi solve(int l,int r)
{
	if(l==r)return {F[l].fi,F[l].se};
	int mid=(l+r)>>1;
	return FFT(solve(l,mid),solve(mid+1,r));
}
void dfs(int x,int fa=0)
{
	for(auto to:T[x])if(to!=fa)dfs(to,x);
	F.clear();
	for(auto to:T[x])if(to!=fa)F.eb(mp(g[to][0],g[to][1]));
	if(F.empty())return g[x][0]=g[x][1]=1,void();
	vi ve=solve(0,F.size()-1);
	for(int i=1;i<=ve.size();++i)Mmul(ve[i-1],fr[i-1]),Madd(g[x][1],Cmul(ve[i-1],i)),Madd(g[x][0],ve[i-1]);
}
inline void mian()
{
	read(n),init(),fr[0]=1;int x,y;
	for(int i=1;i<=n;++i)fr[i]=Cmul(fr[i-1],i);
	for(int i=1;i<n;++i)read(x,y),T[x].eb(y),T[y].eb(x);
	dfs(1),write(g[1][0]);
}

标签:ARC171C,return,int,sum,Tree,solve,Swap,mathcal
From: https://www.cnblogs.com/WrongAnswer90/p/18396740

相关文章

  • DevExpress WinForms v24.1亮点- TreeList、折叠组件全新升级
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!DevExpressWinForms控件2024年第一个重大版本......
  • react diff 学习之tree diff
    treediff主要针对的是reactdom节点跨层级的操作。什么是跨层级的操作呢?除同级之外的操作都是跨层级。比如A节点下有B和C,A的同级有个小狗节点,现在把整个A节点移到小狗节点下。对于这种跨层级操作,react只会进行创建和删除操作,当根节点发现子节点A消失了,就会直接销毁A,当小狗节点......
  • npm install时一直idealTree:npm: sill idealTree buildDeps的解决方案
    修改下镜像的地址。1、采用新的镜像地址,进入cmd之后输入://1.npm的命令npmconfigsetregistryhttps://registry.npmmirror.com//2.yarn的命令yarnconfigsetregistryhttps://registry.npmmirror.com2、查看是否安装成功://npm的命令npmconfiggetregi......
  • DevExpress WinForms v24.1亮点- TreeList、折叠组件全新升级
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!DevExpressWinForms控件2024年第一个重大版本——......
  • Mac版Sourcetree暂存代码和取出代码
    实际开发中经常遇到开发一半,要拉代码或者切分支的情况,这时候开发一半的代码如果不提交或者删除重置是无法拉取和切换分支的,那么这个时候可以把这部分代码暂存起来,然后在想取出的时候取出就行了1.点击暂存文件,如下图2.点击贮藏,然后输入一个标识3.此时就可以正常拉取代码和切换......
  • 基本概念:(Binary Tree)
    基本概念"二叉树"(BinaryTree)这个名称的由来是因为二叉树的每个节点最多有两个子节点,一个左子节点和一个右子节点。其中,“二叉”指的是两个,因此“二叉树”表示每个节点最多可以分支成两个子节点。基本定义:每个节点包含一个值(或数据),另外最多有两个子节点。左子节点和右子节点的......
  • MySQL索引底层结构为什么用B+Tree?
    索引为何不选择二叉树?二叉搜索树是遵守二分搜索法实现的一种数据结构,它具有下面特点:任意节点的左节点不为空时,左节点值小于根节点值;右节点不为空时,右节点值大于根节点值;依次存入数据,如果数据是递增的,则原二叉树退化为链表结构 从动画中可以明显看到,需要经过5次查询才能......
  • P10013 [集训队互测 2023] Tree Topological Order Counting
    Description给定一颗\(n\)个点的有根树,\(1\)是根,记\(u\)的父亲是\(fa_u\)。另给出一长度为\(n\)的权值序列\(b\)。称一个长度为\(n\)的排列\(a\)为这颗树的合法拓扑序,当且仅当\(\forall2\leu\len,a_u>a_{fa_u}\)。对每个点\(u\),定义\(f(u)\)为,在所有这......
  • Spark MLlib模型训练—回归算法 Decision tree regression
    SparkMLlib模型训练—回归算法Decisiontreeregression在机器学习中,决策树是一种常用且直观的模型,广泛应用于分类和回归任务。决策树回归(DecisionTreeRegression)通过将数据集分割成多个区域,构建一棵树形结构,以预测目标变量的连续值。本文将详细探讨Spark中的决......
  • AT cf17 final J Tree MST
    ATcf17finalJTreeMST考场上想出的黑题,然而写挂了……思路考场推出boruvka算法,会的直接跳过就好。结论:一个点向另外一个点连出的最小边,一定在最小生成树上。证明:参考Kruskal生成树的流程,若当前边(最小边)不在最小生成树上,表明边的两端已经在同一个连通块中。那么存在一......