#rMQybttg040205. 1545:Balanced Lineup

1545:Balanced Lineup

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

原题来自 USACO 2007 Jan. Gold

FJ 的 NN 头牛总是按同一序列排队。有一天,FJ 决定让一些牛玩一场飞盘比赛。他准备找一群在队列中位置连续的牛来进行比赛,但是为了避免水平悬殊,牛的身高不应该相差太大。FJ 准备了 QQ 个可能的牛的选择和所有牛的身高。他想知道每一组里面最高和最低的牛的身高差别。


输入格式

第一行:两个整数 NNQQ

第二至第 N+1N+1 行:第 i+1i+1 行是第 ii 头牛的身高 hih_i

N+2N+2 至第 N+Q+1N+Q+1 行:每行两个整数 AABB,表示询问区间 [A,B][A, B] 内最高和最矮牛的身高差。


输出格式

输出 QQ 行,每行一个整数,表示对应询问的答案(最高身高减去最低身高)。


样例

样例输入

6 3
1
7
3
4
2
5
1 5
4 6
2 2

样例输出

6
3
0

样例说明

牛的身高:[1,7,3,4,2,5][1, 7, 3, 4, 2, 5]

询问1:区间 [1,5][1,5] → 身高 1,7,3,4,21,7,3,4,2,最高 77,最低 11,差 66
询问2:区间 [4,6][4,6] → 身高 4,2,54,2,5,最高 55,最低 22,差 33
询问3:区间 [2,2][2,2] → 身高 77,最高最低相同,差 00


数据范围

对于全部数据:

  • 1N5×1041 \le N \le 5\times 10^4
  • 1Q1.8×1051 \le Q \le 1.8\times 10^5
  • 1hi1061 \le h_i \le 10^6
  • 1ABN1 \le A \le B \le N

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}(512 MB)

提示
此题为 静态区间最大值最小值查询 问题,即 RMQ区间最小值查询 的结合。

由于 NN 不大(5×1045\times 10^4),QQ 较大(1.8×1051.8\times 10^5),我们需要 O(1)O(1)O(logN)O(\log N) 的查询。

方法一:两个 ST 表

  • 一个 ST 表维护区间最大值;
  • 另一个 ST 表维护区间最小值;
  • 查询时分别得到最大值和最小值,相减即可。

复杂度:预处理 O(NlogN)O(N \log N),查询 O(1)O(1),总复杂度 O(NlogN+Q)O(N \log N + Q)

方法二:线段树

  • 线段树节点同时维护区间最大值和最小值;
  • 查询时递归合并。

复杂度:预处理 O(N)O(N),查询 O(logN)O(\log N),总复杂度 O(N+QlogN)O(N + Q \log N),在 QQ 较大时可能略慢于 ST 表。

推荐方法:使用 两个 ST 表,查询更快。

ST 表实现

  1. 预处理 log2\log_2 表;
  2. 建立 fmax[i][j]fmax[i][j]fmin[i][j]fmin[i][j],分别表示区间 [i,i+2j1][i, i+2^j-1] 的最大值和最小值;
  3. 初始化 fmax[i][0]=fmin[i][0]=h[i]fmax[i][0] = fmin[i][0] = h[i]
  4. 递推:
    • $fmax[i][j] = \max(fmax[i][j-1], fmax[i+2^{j-1}][j-1])$;
    • $fmin[i][j] = \min(fmin[i][j-1], fmin[i+2^{j-1}][j-1])$;
  5. 查询 [l,r][l, r]
    • k=log2(rl+1)k = \lfloor \log_2(r-l+1) \rfloor
    • maxv=max(fmax[l][k],fmax[r2k+1][k])maxv = \max(fmax[l][k], fmax[r-2^k+1][k])
    • minv=min(fmin[l][k],fmin[r2k+1][k])minv = \min(fmin[l][k], fmin[r-2^k+1][k])
    • 输出 maxvminvmaxv - minv

注意

  • N=5×104N=5\times 10^4log2N16\log_2 N \approx 16,ST 表大小 N×17N \times 178.5×1058.5\times 10^5 个整数,两个表约 1.7×1061.7\times 10^6 个整数,内存约 6.86.8 MB,可以接受;
  • 输入输出量大,建议使用快速 IO。