莫队

使用场景:

  • 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}))\)

奇偶优化:

在奇数块里右端点升序,在偶数块里右端点降序。
为什么会有优化呢?很直观,相邻两个块之间左端点跳的次数会变小

posted @ 2023-09-23 20:47  星河倒注  阅读(34)  评论(0)    收藏  举报