洛谷 P7443 「EZEC-7」加边 题解

出题人题解。


部分分如下:

  • Subtask 2:枚举一下加哪条边,然后按照有向图博弈去做。
  • Subtask 4:在一个自己能到达的必败点,连一条边到后面的另一个必败点。可以后缀 min 处理。
  • Subtask 5:先手则 0,后手则 -1。

考虑必胜点和必败点的思想。当一个点指向的所有点都是必胜点,这个点是必败点。否则是必胜点。叶子节点是必败点。

先不考虑加边,处理出每个点是必胜点还是必败点。接着处理出每个点的改变会不会影响到根的改变。

先考虑加边形成环的情况,是不会使得必败变成必胜的。只会使局面变成平局或不变。证明

不形成环的情况,就是 v 不在 u 到根的路径上。考虑一个 u 改变会影响根。对于这个点是必胜点,肯定是无法改变的。对于这个点是必败点,只要把它连到一个必败点上去,它就能改变。要计算出最小的不在这个点到根路径上的必败点。

接下来的问题是要计算出最小的不在这个点到根路径上的必败点。

  • Subtask 3:每次暴力扫一遍。
  • Subtask 6:发现要维护单点插入、删除和整体 min,用 multiset 等数据结构维护。
  • Subtask 7:在树上跑两遍 dfs,一遍从左往右,一遍从右往左。每次便遍历顺序是先儿子再父亲。会发现在第一次遍历 x 节点前的所有点是树上在 x 左边的点和 x 子树的点,第二次遍历 x 节点前的所有点是树上在 x 右边的点和 x 子树的点。两次的并就是不在 x 到根路径上的点。做个前缀 min 即可。
  • 也还有其他很多的线性做法。

正解复杂度线性。貌似被堆的 log 过去了,但是我不想卡了。

代码细节比较多,但是思路算是清晰的。写得比较丑,就不给代码了。

posted @   Little09  阅读(63)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示