树状数组板子
P14003 [eJOI 2025] Reactions
题目描述
Nicky 正在进行化学反应性的实验。他准备了 \(N\) 个实验,编号为 \(0\) 到 \(N-1\)。现在他需要选择一个起始实验,然后他将执行所有编号不小于所选编号的实验。换言之,若他决定从编号为 \(S\) 的实验开始,他将按顺序进行实验 \(S, S+1, \ldots, N-1\)。
在开始进行起始实验之前,他有一容器溶液,其温度为 \(0\) 度。在第 \(i\) 个实验(\(0 \le i \le N-1\))中,他按如下顺序执行两步:
- 将溶液温度改变一个给定的整数温度值(可以升高、降低任意整数,或保持不变);
- 进行实验并检查是否发生反应。
已知在第 \(i\) 个实验中,温度会改变 \(D_i\) 度——若 \(D_i>0\) 则升高,若 \(D_i<0\) 则降低,若 \(D_i=0\) 则不变。并且,仅当当前温度(完成第 1 步后的温度)大于等于 \(T_i\) 时,第 \(i\) 个实验才会发生反应。注意,无论是否发生反应,第 1 步造成的温度变化都会保留并影响后续实验。
Nicky 希望发生反应的次数尽可能多,以便收集尽可能多的数据。请帮助他计算这一最大次数。
实现细节
你需要实现函数 reactions:
int reactions(int N, std::vector<int> D, std::vector<long long> T)
- \(N\):计划进行的实验数量;
- \(D\):长度为 \(N\) 的整数向量,其中 \(D_i\) 表示第 \(i\) 个实验的温度变化量;
- \(T\):长度为 \(N\) 的整数向量,其中 \(T_i\) 表示第 \(i\) 个实验发生反应所需的最低溶液温度。
该函数在每个测试中被调用一次。它需要返回在恰当选择起始实验的前提下,最多能发生的反应次数。
输入格式
无
输出格式
无
输入输出样例 #1
输入 #1
5
1 1 -3 1 1
1 3 5 1 2
输出 #1
2
输入输出样例 #2
输入 #2
5
1 -3 0 3 2
0 -2 -1 0 3
输出 #2
4
说明/提示
示例 1
考虑如下调用:
reactions(5, {1, 1, -3, 1, 1}, {1, 3, 5, 1, 2})
如果 Nicky 选择从编号为 \(3\) 的实验开始,溶液温度会变为 \(1\),满足该次实验发生反应的条件。下一次实验温度升至 \(2\),再次发生反应。由于不可能得到超过 \(2\) 次反应,函数应返回 \(2\)。
示例 2
考虑如下调用:
reactions(5, {1, -3, 0, 3, 2}, {0, -2, -1, 0, 3})
函数应返回 \(4\),因为若从编号为 \(0\) 的实验开始,Nicky 会在编号为 \(0, 1, 3, 4\) 的实验中观测到反应。温度自 \(0\) 度起,在每次实验后的温度依次为:\(1, -2, -2, 1, 3\)。
约束
- \(1 \le N \le 500\,000\)
- \(-10^9 \le D_i \le 10^9\)
- \(-10^{15} \le T_i \le 10^{15}\)
子任务
| 子任务 | 分值 | 依赖子任务 | 附加约束 |
|---|---|---|---|
| 0 | 0 | - | 样例。 |
| 1 | 15 | 0 | \(N \le 2000\) |
| 2 | 15 | 0 | 满足 \(D_i<0\) 的下标 \(i\) 至多有 \(20\) 个。 |
| 3 | 20 | - | 对每个 \(0 \le i < N\),\(D_i \le 0\) |
| 4 | 20 | 0 | 答案至多为 \(20\)。 |
| 5 | 30 | 0–4 | 无附加约束。 |
翻译由 ChatGPT-5 完成。
翻译题意
通过因式分解,然后七七八八的结论就可以推理出要求出
sum是前缀和数组
然后我们现在相当于对于每一个单点,对于j>i的的区间都要进行查询,然后我们进行离散化,所以我们把sumj-tj离散化,ti也离散化,因为每次查询的是区间i到n,然后对这一段区间进行修改,在进行单点查询,复杂度都是lgn,然后大概就写完了。
具体还得看一下树状数组,
#define lowbit(x) (x&(-x))
i64 tr[M<<2];
inline void change(i64 x) {
for (; x <= cnt; x += lowbit(x))
tr[x]++;//修改上面结点的值
}
inline i64 query(i64 x) {
i64 ans = 0;
for (; x; x -= lowbit(x))
ans += tr[x];//查询对应结点的值
return ans;
}
}seg;

浙公网安备 33010602011771号