CF2002D2 DFS Checker (Hard Version) 题解

https://codeforces.com/problemset/problem/2002/D2


考虑找一个容易维护的必要条件,再证明充分性。我们希望这个条件在 swap 后需要重新 check 的不多

每个子树对应一个区间,子树根位于左端点

父子

自下而上地 check 每个子树都合法

父子 u,v 满足 dfn[u]<dfn[v]dfn[v]+siz[v]1dfn[u]+siz[u]1

只需要 check min{dfn[v]},max{dfn[v]+siz[v]1}multiset 维护

时间复杂度 O((n+q)logn)

相邻位置

相邻的结点 pi1,pi 有两种情况:fa[pi]=pi1;叶子 pi1 在子树 fa[pi] 中,回溯到 fa[pi]fa[pi]pi1 方向的子树搜完了),再递归到 pi

事实上不需要括号中的条件

p1=1pi1 在子树 fa[pi]

Pf. 对于子树 u,满足 pi1 不在子树 u 中且 pi 在子树 u 中的位置只有一个 pi=u(只有子树 fa[u] 中有不在子树 u 中的点)

时间复杂度 O(n+q)

posted @   ft61  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示