历史(history.c/cpp/pas)
8.28
思路:
做法一:【数据结构优化暴力】
30%做法:由于只需要知道连通性,我们可以维护森林。有一个比较好的暴力方法是,连边时在边上记录这条边连上的时刻,询问时求两点之间最迟的边即可知道这两个点连通的时刻,暴力复杂度O(nm),能拿到30%的分数。【这个思路很重要!】
100%做法:套上个LCT即可。但由于数据范围较大,可能需要优化常数,由于数据有梯度,具体分数根据代码的丑陋程度而定。
做法二:【利用题目性质离线】
30%做法:对于特殊的另外30%,可以离线。那么把询问按时间排序,再套个并查集即可,复杂度O(m),能拿到30%的分数。和一个大暴力组合就能拿到60%的分数。【由于不太方便表示,将并查集的复杂度看作常数】
100%做法:此题只有修改强制在线,而询问不强制在线,实际上仔细观察,就可以发现仍然可以离线来做。复杂度O(m),能拿到100%的分数。
做法三:【简洁且能够处理询问也强制在线的情况】
30%做法:暴力存下每次的并查集。复杂度O(nm)。
70%做法:熟悉数据结构的同学应该很容易想到这个做法。这道题显然可以用可持久化并查集维护,用按秩合并套上一个可持久化线段树维护fa数组。复杂度O(nlog2n),由于数据有梯度,这个做法本地测试时给了70%的分数。但是要是又遇到跑得十分快的评测机,那我也