2024.9.16 上午 总结(考 DS)
T1
我的做法:
-
合并 -> 并查集。类似建 Kruskal 重构树。询问跑 LCA。
-
注意并查集合并要把两个根都变成一个新点的儿子,而不是把一个作为另一个的儿子。(可能类似建 [边](?) Kruskal 重构树)
-
要特判询问时 \(x = y\) 的情况(好像是输出 \(0\))。
lzh 的做法:
-
连出一棵树,边的边权是 它是第几条边。每次询问问的是一条链上的 \(\max\)。用树剖做。
-
其实也可以建这棵树的 Kruskal 重构树([边](?))来做。这个重构树好像就是我的做法里建出来的树。
xwb 的做法:
在某个询问的答案之前,这两个点是不连通的。而在这个答案及以后,这两个点就连通了。
对操作(加边)分块(块长是根号)。
记一下[每个块结尾处](???)的 fa 数组(前面的边都加上时)。通过这个找每个询问的答案是在哪个块里的。
对每个块里的询问一起处理。在每个块里暴力走,每走一步暴力对这个块里的所有询问判是否可行即可。
题解提到的整体二分做法(我的理解)
和 xwb 的做法一样,利用了“在某个询问的答案之前,这两个点是不连通的。而在这个答案及以后,这两个点就连通了”。
发现单调性,于是考虑二分。有多个询问,所以整体二分。
T2
以前水哥给我们讲课的时候有这道题。
把第二个排列里每个数换成它在第一个排列中出现的位置,跑最长上升子序列即可。
线段树优化。可能也可以树状数组优化。好像还可以用神秘[贪心 LIS 做法](?)。
T3
不太大的模拟。map 启动!
要注意细节和整体框架,要想清楚,[想清楚再写](?)。
注意
-
倍增 LCA 根的 dep 应比 0 的 dep 大。
-
注意倍增 LCA 的初值。(虽然好像好多都不用手动赋,直接全局就是 \(0\))
-
不要忘了初始化下标为 0 的东西。
2024.9.16