题目 1820

区间最大利润

查看题解 ↗GitHub ↗如何评测
题号
1820
时间限制
1000 ms
内存限制
128 MB
标签
线段树分治
来源
ROJ 原创(配套 1417 最大利润 的区间询问加强版)

【题目描述】

给定一个长度为 nn 的数列 A1,A2,…,AnA_1, A_2, \dots, A_n,其中 AiA_i 表示第 ii 天的价格。

一笔交易的利润定义为「先买后卖」的差价:在时刻 ii 买入、时刻 jj 卖出(i<ji < j)可获得 Aj−AiA_j - A_i 的利润。

现在有 qq 次询问,每次给定 l,rl, r,请求出只在区间 [l,r][l, r] 内交易时能获得的最大利润,即求

max⁡l⩽i<j⩽r(Aj−Ai)\max_{l \leqslant i < j \leqslant r} \left( A_j - A_i \right)

【输入】

第一行两个整数 n,qn, q,分别表示天数与询问次数。

第二行 nn 个整数 A1,A2,…,AnA_1, A_2, \dots, A_n。

接下来 qq 行,每行两个整数 l,rl, r,表示一次询问。

【输出】

对于每次询问输出一行一个整数,表示区间 [l,r][l, r] 内的最大利润。

【数据范围】

2⩽n⩽1052 \leqslant n \leqslant 10^5

1⩽q⩽1051 \leqslant q \leqslant 10^5

1⩽Ai⩽1091 \leqslant A_i \leqslant 10^9

1⩽l<r⩽n1 \leqslant l < r \leqslant n

【输入样例】

文本
6 4
5 3 1 3 4 3
1 6
1 4
3 6
4 5

【输出样例】

文本
3
2
3
1

【样例解释】

  • 询问 [1,6][1,6]:在第 3 天买入(价格 11)、第 5 天卖出(价格 44),利润 4−1=34-1=3;
  • 询问 [1,4][1,4]:区间为 5,3,1,35,3,1,3,在第 3 天买入(11)、第 4 天卖出(33),利润 3−1=23-1=2;
  • 询问 [3,6][3,6]:区间为 1,3,4,31,3,4,3,在第 3 天买入(11)、第 5 天卖出(44),利润 33;
  • 询问 [4,5][4,5]:区间为 3,43,4,利润 4−3=14-3=1。

【提示】

  • 注意利润可能为负数:当区间内价格严格递减时,最优仍必须先买后卖,此时答案是最小的负数(例如区间为 4,3,24,3,2 时答案为 −1-1)。
  • 每次询问相互独立,区间之外的价格不能参与交易。
  • 直接对每次询问扫描区间是 O(nq)O(nq),无法通过;需要考虑能快速合并区间信息的数据结构。

【来源】

ROJ 原创(配套 1417 最大利润 的区间询问加强版)

数据下载

题目 1820 的公开数据

正在读取文件列表…

常用命令

题目 1820 的 ROJ 命令

以下命令默认使用全局安装的 ROJ Skill,请在终端中直接执行;如果修改过 AGENT_HOME,请将命令中的 ~/.agents 替换为对应目录。