ARC171C

题面

给定一棵 n 个节点的树,每个点有个权值 ai,初始时 ai=i

你可以执行任意操作:选择一条边 (u,v),交换 auav,并将这条边删掉。

问通过上述操作,最后 (a1,a2,,an) 有多少种不同的排列方式,答案对 998244353 取模。

数据范围:n3×103

题解

算是一个结论题,首先对于两个方案,如果连操作的边的集合都不相同,那么这两种方案得到的序列肯定不一样。

然后再看还有什么情况。对于两个方案,对于树上的每一个点 x,如果点 x 周边要操作的边的相对相对顺序都一样,那么这两种方案得到的 a 就相同,否则就不同。

证明?大致是只要操作时两边的点权都相同,那么最终产生的 a 肯定相同。

所以考虑对于一种 操作的边的集合 计算答案。

这里又是一个结论?就是无论怎么确定 x 周边的边的相对操作顺序,都可以找到一个总的边的操作顺序,因为对于边 a,b,c ,不会出现 (a,b),(b,c),(a,c) 有相同端点,从而出现 ta<tb,tb<tc,ta>tc 的情况。

所以答案就是 Ei=1ndegi,E!,其中 degi,E 表示节点 i 在边集 E 中的度数。

然后考虑dp求答案,设 fx,i,0/1 表示只考虑以 x 为根的子树中,与 x 相连的所有边中选了 i 条,且 x 与其父亲之间的边有没有断的方案数。有转移:

fx,i,0fx,i,0gy,0+fx,i1,0igy,1fx,i,1fx,i,1gy,0+fx,i1,0igy,1

启发

  • 对于题面问题,考虑求最终方案数时,关键是看每一条边操作时两点的点权。
  • 在考虑是否存在一个排列,并且满足一些数的相对大小时,看会不会出现 ta<tb,tb<tc,ta>tc 就行了。

本文作者:qwq_123

本文链接:https://www.cnblogs.com/qwq-123/p/18045749

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   qwq_123  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起