*[题解]GFUOJP2309简单的区间
标准题解:
考虑分治。定义过程\(solve(l,r)\)代表左右端点都在区间\([l,r]\)之之间的合法区间数量。
我们找出\([l,r]\)内最大值的位置k,处理所有过k的区间,然后递归调用\(solve(l,k-1)\)和\(solve(k+1,r)\)。
如果我们暴力地枚举区间的左/右端点,再在另一侧查询合法的另一个端点的数量,复杂度显然是\(O(n^2)\)。
考虑优化,如果\(r-k<k-l\),我们就枚举右端点,否则枚举左端点。
这样的话,如果一个位,被枚举到了一次,那它所在的区间至少会缩小到原来的一半,因此一个位置多会被枚举\(log n\)次。
接下来我们要处理的就是\(O(nlog n)\)个形如"\(x\)在区间\([l,r]\)内出现了几次"的询问,只需要离线处理即可。
时间复杂度\(O(nlog n)\)。
这篇挺细的,一遍就懂:https://blog.csdn.net/qq_36551189/article/details/81635694