uoj#P660. 【IOI2021】candies
【IOI2021】candies
由于某些原因本题仅支持 C++, C++11 语言的提交。
Khong 阿姨正在给附近一所学校的学生准备 $n$ 盒糖果。盒子的编号分别为 $0$ 到 $n - 1$,开始时盒子都为空。第 $i$ 个盒子($0 \le i \le n - 1$)至多可以容纳 $c[i]$ 块糖果(容量为 $c[i]$)。
Khong 阿姨花了 $q$ 天时间准备糖果盒。在第 $j$ 天($0 \le j \le q - 1$),她根据三个整数 $l[j]$、$r[j]$ 和 $v[j]$ 执行操作,其中 $0 \le l[j] \le r[j] \le n - 1$ 且 $v[j] \ne 0$。对于每个编号满足 $l[j] \le k \le r[j]$ 的盒子 $k$:
- 如果 $v[j] > 0$,Khong 阿姨将糖果一块接一块地放入第 $k$ 个盒子,直到她正好放了 $v[j]$ 块糖果或者该盒子已满。也就是说,如果该盒子在这次操作之前已有 $p$ 块糖果,那么在这次操作之后盒子将有 $\min{(c[k], p + v[j])}$ 块糖果。
- 如果 $v[j] < 0$,Khong 阿姨将糖果一块接一块地从第 k 个盒子取出,直到她正好从盒子中取出 $-v[j]$ 块糖果或者该盒子已空。也就是说,如果该盒⼦在这次操作之前已有 $p$ 块糖果,那么在这次操作之后盒子将有 $\max{(0, p + v[j])}$ 块糖果。
你的任务是求出 $q$ 天之后每个盒子中糖果的数量。
实现细节
你必须引用 candies.h
头文件。
你要实现以下函数:
int[] distribute_candies(int[] c, int[] l, int[] r, int[] v)
- $c$:一个长度为 $n$ 的数组。对于 $0 \le i \le n - 1$,$c[i]$ 表示盒子 $i$ 的容量。
- $l$、$r$ 和 $v$:三个长度为 $q$ 的数组。在第 $j$ 天,对于 $0 \le j \le q - 1$,Khong 阿姨执行由整数 $l[j]$、$r[j]$ 和 $v[j]$ 决定的操作,如题面所述。
- 该函数应该返回一个长度为 $n$ 的数组。用 $s$ 表示这个数组。对于 $0 \le i \le n - 1$,$s[i]$ 应为 $q$ 天以后盒子 $i$ 中的糖果数量。
输入格式
评测程序示例读入如下格式的输入:
- 第 $1$ 行:$n$
- 第 $2$ 行:$c[0] \; c[1] \; \ldots \; c[n - 1]$
- 第 $3$ 行:$q$
- 第 $4 + j$ 行($0 \le j \le q - 1$):$l[j] \; r[j] \; v[j]$
输出格式
评测程序⽰例按照以下格式打印你的答案:
- 第 $1$ 行:$s[0] \; s[1] \; \ldots \; s[n - 1]$
3
10 15 13
2
0 2 20
0 1 -11
0 4 13
考虑如下调用:
distribute_candies([10, 15, 13], [0, 0], [2, 1], [20, -11])
这表示盒子 $0$ 的容量为 $10$ 块糖果,盒子 $1$ 的容量为 $15$ 块糖果,盒子 $2$ 的容量为 $13$ 块糖果。
在第 $0$ 天结束时,盒子 $0$ 有 $\min{(c[0], 0 + v[0])} = 10$ 块糖果,盒子 $1$ 有 $\min{(c[1], 0 + v[0])} = 15$ 块糖果,盒子 $2$ 有 $\min{(c[2], 0 + v[0])} = 13$ 块糖果。
在第 $1$ 天结束时,盒子 $0$ 有 $\max{(0, 10 + v[1])} = 0$ 块糖果,盒子 $1$ 有 $\max(0, 15 + v[1]) = 4$ 块糖果。因为 $2 > r[1]$,盒子 $2$ 中的糖果数量没有变化。每一天结束时糖果的数量总结如下:
天 | 盒子 $0$ | 盒子 $1$ | 盒子 $2$ |
---|---|---|---|
$0$ | $10$ | $15$ | $13$ |
$1$ | $0$ | $4$ | $13$ |
就此情况,函数应该返回 $[0, 4, 13]$。
数据范围
对于所有数据:
- $1 \le n \le 200 \, 000$
- $1 \le q \le 200 \, 000$
- $1 \le c[i] \le {10}^9$(对所有 $0 \le i \le n - 1$)
- $0 \le l[j] \le r[j] \le n - 1$(对所有 $0 \le j \le q - 1$)
- $-{10}^9 \le v[j] \le {10}^9$,$v[j] \ne 0$(对所有 $0 \le j \le q - 1$)
子任务 | 分值 | 特殊限制 |
---|---|---|
$1$ | $3$ | $n, q \le 2000$ |
$2$ | $8$ | $v[j] > 0$(对所有 $0 \le j \le q - 1$) |
$3$ | $27$ | $c[0] = c[1] = \cdots = c[n - 1]$ |
$4$ | $29$ | $l[j] = 0$ 和 $r[j] = n - 1$(对所有 $0 \le j \le q - 1$) |
$5$ | $33$ | 没有额外的约束条件 |
时间限制:$\texttt{4s}$
空间限制:$\texttt{2GB}$