ARC171C
题面
给定一棵 个节点的树,每个点有个权值 ,初始时 。
你可以执行任意操作:选择一条边 ,交换 和 ,并将这条边删掉。
问通过上述操作,最后 有多少种不同的排列方式,答案对 取模。
数据范围: 。
题解
算是一个结论题,首先对于两个方案,如果连操作的边的集合都不相同,那么这两种方案得到的序列肯定不一样。
然后再看还有什么情况。对于两个方案,对于树上的每一个点 ,如果点 周边要操作的边的相对相对顺序都一样,那么这两种方案得到的 就相同,否则就不同。
证明?大致是只要操作时两边的点权都相同,那么最终产生的 肯定相同。
所以考虑对于一种 操作的边的集合 计算答案。
这里又是一个结论?就是无论怎么确定 周边的边的相对操作顺序,都可以找到一个总的边的操作顺序,因为对于边 ,不会出现 有相同端点,从而出现 的情况。
所以答案就是 ,其中 表示节点 在边集 中的度数。
然后考虑dp求答案,设 表示只考虑以 为根的子树中,与 相连的所有边中选了 条,且 与其父亲之间的边有没有断的方案数。有转移:
启发
- 对于题面问题,考虑求最终方案数时,关键是看每一条边操作时两点的点权。
- 在考虑是否存在一个排列,并且满足一些数的相对大小时,看会不会出现 就行了。
本文作者:qwq_123
本文链接:https://www.cnblogs.com/qwq-123/p/18045749
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通