#P14003. [eJOI 2025] Reactions

    ID: 13979 远端评测题 2500ms 256MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>线段树平衡树树状数组2025离散化交互题eJOI(欧洲)

[eJOI 2025] Reactions

Description

Nicky 正在进行化学反应性的实验。他准备了 NN 个实验,编号为 00N1N-1。现在他需要选择一个起始实验,然后他将执行所有编号不小于所选编号的实验。换言之,若他决定从编号为 SS 的实验开始,他将按顺序进行实验 S,S+1,,N1S, S+1, \ldots, N-1

在开始进行起始实验之前,他有一容器溶液,其温度为 00 度。在第 ii 个实验(0iN10 \le i \le N-1)中,他按如下顺序执行两步:

  1. 将溶液温度改变一个给定的整数温度值(可以升高、降低任意整数,或保持不变);
  2. 进行实验并检查是否发生反应。

已知在第 ii 个实验中,温度会改变 DiD_i 度——若 Di>0D_i>0 则升高,若 Di<0D_i<0 则降低,若 Di=0D_i=0 则不变。并且,仅当当前温度(完成第 1 步后的温度)大于等于 TiT_i 时,第 ii 个实验才会发生反应。注意,无论是否发生反应,第 1 步造成的温度变化都会保留并影响后续实验。

Nicky 希望发生反应的次数尽可能多,以便收集尽可能多的数据。请帮助他计算这一最大次数。

实现细节

你需要实现函数 reactions

int reactions(int N, std::vector<int> D, std::vector<long long> T)
  • NN:计划进行的实验数量;
  • DD:长度为 NN 的整数向量,其中 DiD_i 表示第 ii 个实验的温度变化量;
  • TT:长度为 NN 的整数向量,其中 TiT_i 表示第 ii 个实验发生反应所需的最低溶液温度。

该函数在每个测试中被调用一次。它需要返回在恰当选择起始实验的前提下,最多能发生的反应次数。

5
1 1 -3 1 1
1 3 5 1 2
2
5
1 -3 0 3 2
0 -2 -1 0 3
4

Hint

示例 1

考虑如下调用:

reactions(5, {1, 1, -3, 1, 1}, {1, 3, 5, 1, 2})

如果 Nicky 选择从编号为 33 的实验开始,溶液温度会变为 11,满足该次实验发生反应的条件。下一次实验温度升至 22,再次发生反应。由于不可能得到超过 22 次反应,函数应返回 22

示例 2

考虑如下调用:

reactions(5, {1, -3, 0, 3, 2}, {0, -2, -1, 0, 3})

函数应返回 44,因为若从编号为 00 的实验开始,Nicky 会在编号为 0,1,3,40, 1, 3, 4 的实验中观测到反应。温度自 00 度起,在每次实验后的温度依次为:1,2,2,1,31, -2, -2, 1, 3

约束

  • 1N5000001 \le N \le 500\,000
  • 109Di109-10^9 \le D_i \le 10^9
  • 1015Ti1015-10^{15} \le T_i \le 10^{15}

子任务

子任务 分值 依赖子任务 附加约束
0 - 样例。
1 15 0 N2000N \le 2000
2 满足 Di<0D_i<0 的下标 ii 至多有 2020 个。
3 20 - 对每个 0i<N0 \le i < NDi0D_i \le 0
4 0 答案至多为 2020
5 30 0–4 无附加约束。

翻译由 ChatGPT-5 完成。