古典叙事 · 技术札记

序章

山河有卷
人间有声

写代码,也写长风、旧城与未熄的灯。
愿每一篇随笔,都有自己的山水与回声。
阅览随笔

树状数组板子

P14003 [eJOI 2025] Reactions

题目描述

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

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

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

已知在第 \(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 完成。

翻译题意

通过因式分解,然后七七八八的结论就可以推理出要求出image
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;
posted @ 2025-11-17 19:56  Morphis‘  阅读(13)  评论(0)    收藏  举报

特别策划 · CINEMATIC NOTES

风沙与孤骑

风起塞外,
胜负在刀剑之前。

“把复杂拆成秩序,把未知写成答案。”
Morphis · 山河一卷 愿你从这里出发,仍能听见山风。 影像:farfarSébastien Goldberg / Unsplash