使用场景:
- 1.离线算法
- 2.静态区间询问
- 3.对于询问\([L,R]\),可以\(O(1 / log)\)从\([L+1,R]\)或\([L,R-1]\)转移过来
算法思想:
将\(L\)视为横轴,\(R\)视为纵轴,则一次区间询问可以视为坐标系中的一个点。\(Q\)次询问的转移构成一棵生成树。当取曼哈顿距离的最小生成树,转移的总代价相等。
代码实现:
- 1.将询问离线,分块
- 2.将询问排序,第一关键字为左端点,第二关键字为右端点(若左端点在同一个块里,右端点从小到大排序,否则左端点从小到大排序)
时间复杂度分析:
设块的大小为\(size\)(左端点之差小于等于\(size\))
一个块里:右端点单调,最多复杂度\(O(n)\),左端点一次最多移\(size\)次,时间~\(O(m \times size + n \times (\frac{n}{size}))\)
奇偶优化:
在奇数块里右端点升序,在偶数块里右端点降序。
为什么会有优化呢?很直观,相邻两个块之间左端点跳的次数会变小