要退役了。
记录一下 B 赛事思路,虽然最后没写完也没调出来复杂度也不对。
希望思路能对上一点,这样可能比真的一点不会导致的退役心情要好一点?
建一个虚根,连向所有入度为 0 的点,然后开始 dfs 出一棵生成树。由于是个 DAG,所以只会有横叉边,而不会有返祖边。
这样对于每个点的询问,可以遍历他的所有出点(包括自己),这样就是查子树内 \(a\in[l,r]\) 的最大的 \(b\),带修的话可以树套树,时间复杂度 \(O(nq\log^2n)\)。
遍历出点太慢,考虑根号分治。
对于出点数 \(>\sqrt m\) 的,我们对所有这样的每个开一棵以 \(a\) 为下标的线段树,这样的点最多只有 \(\sqrt m\) 个,每次修改的话最多把这些点对应的线段树都改一遍,时间复杂度 \(O(q\sqrt m\log n)\)。
对于出点数 \(\le \sqrt m\) 的,直接暴力遍历是 \(O(\sqrt m)\) 的,然后套上动态二维数点,时间复杂度 \(O(q\sqrt m\log^2 n)\)。
这是理论复杂度分析,实际上遍历出点这个东西不被刻意卡的话非常不满,有理由怀疑两个 \(\log\) 能拿挺多分的。我写挂了瞪不出来,遗憾离场。
赛时只能想到这些了,大概率是跟正解一点没对上吧。