1、当你想要保证每个点只被覆盖一次……
直接用 vis 数组是不行的
因为每个点的 vis 被修改过一次,每次被修改都会有n次操作……
所以可以用“链表(Cyber_Tree语)”“并查集(Rings语)”优化修改过程,使每次操作完一个数就跳过这个数。
要我起个名字的话,就叫他“过河拆桥”吧。。。
大体思路:
每个数 \(i\) 记录一个 \(nxt_i\) ,表示这个数之后下一个未被修改的数的位置。
每次从 l 到 r 修改后,对于所有 \(i\in[l,r]\) ,新的 \(nxt_i\) 赋值为 \(\max(nxt_i,nxt_r)\) 。
这样的话,每次操作完 i 后,下一次跳到 \(nxt_i\) 操作即可。
顺便也保证了每个点只被经过一次。
(但是好像在边界还有点锅,竟然得加 vis 数组)