问题类型
适用于询问是一段区间[L,R],可以离线,并且时间复杂度一个根号跑的过的情况下。
解决方案
我们把n个数分成sqrt(n)个块,每个块就会有sqrt(n)个数。
假设i被分到了Belong[i]这个块。
我们先把所有询问按Belong[L]从小到大排序(如果Belong[L]相等,就按R从小到大)。
然后我们就把前一个区间暴力扩展删除到现在的区间为止。
L指针每一个询问最多移动sqrt(n)次,总共 q sqrt(n)。
R指针每不同的Belong[L]最多移动n次,最多sqrt(n)个块,总共 n sqrt(n)。
所以总时间复杂度为(n + q) * sqrt(n)。
代码演示
1 | int cmp(node X, node Y) |