2025.2.21的模拟赛题“樱花树”题解
2025.2.21的模拟赛题“樱花树”题解
为避免混淆,题目中的
操作标号法,将不同的操作标号,并用无序列表的方式罗列各自的限制,可以使得逻辑清晰
称前
设
限制就是
到跟的路径不能做1号操作,x的子树中不能做2号操作 节点本身的操作既不计入1,也不计入2,可以看作不操作- 子树中执行了2号操作,其到根节点就不能执行1号操作
dp 方程也十分简单了,
这样复杂度
考虑优化,令
将节点分为三类
对于
对于
主要是对于
我们发现1号操作
一种巧妙地思路是,设
首先考虑如何从父亲继承:
什么意思呢?
-
首先如果
节点不进行删除操作,那么所有在 节点之后操作的也会在 节点之后,然而当 的时候 必须执行删除操作,所以有 的贡献 -
如果
要执行删除操作,那么对于每一种 之后的删除节点的操作序列,都可以选择任意多的节点放在 之前删除,其余的放在 之后操作,由于每种操作序列的顺序是确定的,这里不需要乘以组合数,有 的贡献
接下来考虑如何合并
于是我们在
代码(去掉取模了,应该是很好理解的):
g[0]=1;
for(int x:anc){
for(int i=all,sum=0;i>=0;i--){
sum+=g[i];
g[i]=(x==1||x==u?0:g[i])+sum;
}
for(int i=0;i<=all;i++)tmp[i]=g[i],g[i]=0;
for(int i=0;i<=all;i++)
for(int j=0;j<=siz[x];j++)
g[i+j]+=tmp[i]*f[x][j]*c[i+j][i];
all+=siz[x];
}
cout<<g[K-1];
作者:lupengheyyds
出处:https://www.cnblogs.com/lupengheyyds/p/18730058
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】