#L5467. #5467. 「eJOI2025」反应

    ID: 5296 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>贪心数据结构前缀和前缀和单调栈队列

#5467. 「eJOI2025」反应

#5467. 「eJOI2025」反应

题目描述

题目译自 eJOI2025eJOI2025 Day2Day2 T2.T2. Reactions

Nicky 正在进行化学反应性的实验。他准备了 NN 个实验,编号从 00N1N - 1。现在他需要选择他的起始实验,然后他将进行所有编号大于或等于所选实验的实验。换句话说,如果他决定从编号为 SS 的实验开始,他将按顺序进行实验 S,S+1,,N1S, S+1, \dots, 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,温度保持不变。此外,第 ii 个实验中的反应仅在当前温度(变化后)大于或等于 TiT_i 时才会发生。请注意,无论反应是否发生,第一步的温度变化都会持续存在。

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 个实验期间发生反应所需的溶液最低温度。

对于每个测试点,该函数将被调用一次。它必须返回在适当选择起始实验的情况下可能发生的最大反应次数。

样例 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,30, 1, 344 的实验中观察到反应。温度从 00 摄氏度开始,在每个实验期间的温度分别为:1,2,2,1,31, -2, -2, 1, 3

输入格式

第一行包含一个整数:NN 的值。

第二行包含 NN 个整数:D0,D1,,DN1D_0, D_1, \dots, D_{N-1}

第三行包含 NN 个整数:T0,T1,,TN1T_0, T_1, \dots, T_{N-1}

输出格式

第一行包含一个整数:该调用的返回值。

数据范围与提示

对于所有输入数据,满足:

  • 1N500 0001 \leq N \leq 500~000
  • 109Di109-10^9 \leq D_i \leq 10^9
  • 1015Ti1015-10^{15} \leq T_i \leq 10^{15}

详细子任务附加限制及分值如下表所示。

子任务 分值 子任务依赖 附加限制
0 00 - 样例。
1 1515 0 N2000N \le 2000
2 最多有 2020 个编号 ii 使得 Di<0D_i < 0
3 2020 - 对于每个 0i<N0 \leq i < N,有 Di0D_i \leq 0
4 0 答案最多为 2020
5 3030 0 - 4 -