《跳舞的大象》是芭堤雅的一场精彩表演,舞台上共有 $N$ 只大象在排成一线跳舞。
经过多年的训练,这些大象能够表演许多令人惊叹的舞蹈。表演由一系列动作组成。在每个动作中,恰好有一只大象会跳一段可爱的舞蹈,并可能移动到不同的位置。
演出制作人希望制作一本包含整场演出照片的相册。在每个动作之后,他们都希望拍摄所有大象在观众眼中的照片。
在演出期间的任何时候,多只大象可能处于同一位置。在这种情况下,它们只是站在彼此身后。
当且仅当一组大象的所有位置都位于某个长度为 $L$ 的线段内(包括该线段的两个端点)时,单台摄像机才能拍摄到这组大象的照片。由于大象可以分散在舞台上,因此可能需要多台摄像机才能同时拍摄到所有大象。
例如,假设 $L=10$,大象在舞台上的位置分别为 $10, 15, 17$ 和 $20$。此时,单台摄像机可以拍摄到它们的照片,如下图所示。(大象显示为三角形;摄像机显示为梯形。)
在接下来的动作中,位于位置 $15$ 的大象移动到了位置 $32$。在此动作之后,我们需要至少两台摄像机来拍摄照片。
在下一个动作中,位于位置 $10$ 的大象移动到了位置 $7$。对于大象的这种新排列,我们需要三台摄像机来拍摄它们。
在这个交互式任务中,你必须确定在每个动作之后拍摄照片所需的最少摄像机数量。请注意,所需摄像机的数量在动作之间可能会增加、减少或保持不变。
实现细节
你需要编写以下过程:
init(N, L, X):该过程包含以下参数:- $N$:大象的数量。大象编号为 $0$ 到 $N-1$。
- $L$:单台摄像机可覆盖的线段长度。你可以假设 $L$ 是一个整数,满足 $0 \le L \le 1\,000\,000\,000$。
- $X$:一个一维整数数组,表示大象的初始位置。对于 $0 \le i < N$,第 $i$ 只大象起始于位置 $X[i]$。初始位置已按升序排列。更准确地说,你可以假设 $0 \le X[0] \le \dots \le X[N-1] \le 1\,000\,000\,000$。注意,在舞蹈过程中,大象可能会重新排序。
此过程在所有
update调用之前仅会被调用一次。它不返回任何值。update(i, y):该过程包含以下参数:- $i$:当前动作中移动的大象编号。
- $y$:第 $i$ 只大象在当前动作后所处的位置。你可以假设 $y$ 是一个整数,满足 $0 \le y \le 1\,000\,000\,000$。
此过程会被调用多次。每次调用对应一个动作(该动作是在之前所有动作的基础上进行的)。每次调用必须返回在相应动作之后拍摄所有大象所需的最少摄像机数量。
样例
考虑 $N=4, L=10$,大象的初始位置为: $X = [10, 15, 17, 20]$
首先,你的 init 过程会被调用。随后,你的 update 过程将针对每个动作被调用一次。以下是调用序列及对应的返回值:
| 动作 | 调用参数 | 返回值 |
|---|---|---|
| 1 | update(2, 16) |
1 |
| 2 | update(1, 25) |
2 |
| 3 | update(3, 35) |
2 |
| 4 | update(0, 38) |
2 |
| 5 | update(2, 0) |
3 |
子任务
子任务 1 (10 分):
- 恰好有 $N = 2$ 只大象。
- 初始时以及每次动作后,所有大象的位置均不相同。
update过程最多被调用 $100$ 次。
子任务 2 (16 分):
- $1 \le N \le 100$。
- 初始时以及每次动作后,所有大象的位置均不相同。
update过程最多被调用 $100$ 次。
子任务 3 (24 分):
- $1 \le N \le 50\,000$。
- 初始时以及每次动作后,所有大象的位置均不相同。
update过程最多被调用 $50\,000$ 次。
子任务 4 (47 分):
- $1 \le N \le 70\,000$。
- 大象可能处于同一位置。
update过程最多被调用 $70\,000$ 次。
子任务 5 (3 分):
- $1 \le N \le 150\,000$。
- 大象可能处于同一位置。
update过程最多被调用 $150\,000$ 次。- 请参阅“实现细节”部分关于 CPU 时间限制的说明。
限制与接口
- CPU 时间限制:$9$ 秒。 注意:C++ 标准库 (STL) 中的容器模板可能较慢;特别是,如果你使用它们,可能无法解决子任务 5。
- 内存限制:$256$ MB。 注意:栈内存大小没有明确限制。栈内存计入总内存使用量。
- 实现文件夹:
elephants/ - 选手需实现的文件:
elephants.c或elephants.cpp或elephants.pas - 选手接口文件:
elephants.h或elephants.pas - 样例评测程序:
grader.c或grader.cpp或grader.pas - 样例评测输入:
grader.in.1,grader.in.2, ...
注意:样例评测程序按以下格式读取输入:
第 1 行:$N, L$ 和 $M$,其中 $M$ 是演出中的动作次数。
第 2 行至第 $N+1$ 行:初始位置;即第 $k+2$ 行包含 $X[k]$,其中 $0 \le k < N$。
第 $N+2$ 行至第 $N+M+1$ 行:关于 $M$ 个动作的信息;即第 $N+1+j$ 行包含 $i[j], y[j]$ 和 $s[j]$,以空格分隔,表示在第 $j$ 个动作中,第 $i[j]$ 只大象移动到了位置 $y[j]$,且在该动作之后,所需的最少摄像机数量为 $s[j]$,其中 $1 \le j \le M$。
样例评测程序的预期输出:grader.expect.1, grader.expect.2, ...
对于此任务,这些文件中的每一个都应精确包含文本 “Correct.”。