TonviaSzt
2024-11-17 19:58:50
很有意思,总结了三种做法。
Problem Link
简要题意
有
q 次询问,每次给出长度为n\le 5\cdot10^5 的序列,称i 与j 是互相可达的当且仅当i<j\ |\ a_i>a_j 。问从每个位置i 出发能到达的最大高度。
思路分析
赛时给出一种做法,赛后学到两种。不过 CF 的 Editorial 是最巧妙的,三种方法的方向几乎完全不同。
连通性问题首先考虑建边跑并查集。朴素想法是考虑一个位置向左一步能跳到的位置,但是这样建边复杂度是
发现很多边实际是冗余的,当一个位置
赛时并查集不用 dsu 超时了一发,难绷。
Submission
从同伴那学到的,感觉也很妙。
可以发现所有的跳跃都是若干次上图的折线跳跃或者折线的一部分。我们将上述折线分成“向右跳”和“向左跳”两部分。
考虑第二个绿色条
这时候再考虑如何求图中红色条的最值,正序扫描,类似上面的情况处理即可。
考虑
因此维护前缀最大值和后缀最小值,再扫描转移即可,复杂度是可喜的
Submission
真是妙妙妙极了。