*[题解]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

posted @ 2020-07-29 19:42  ZTC_ZTC  阅读(168)  评论(0编辑  收藏  举报