#L3523. 「IOI2021」分糖果

「IOI2021」分糖果

题目描述

Khong 阿姨正在给附近一所学校的学生准备 nn 盒糖果。盒子的编号分别为 00n1n - 1,开始时盒子都为空。第 ii 个盒子(0in10 \le i \le n - 1)至多可以容纳 c[i]c[i] 块糖果(容量为 c[i]c[i])。

Khong 阿姨花了 qq 天时间准备糖果盒。在第 jj 天(0jq10 \le j \le q - 1),她根据三个整数 l[j]l[j]r[j]r[j]v[j]v[j] 执行操作,其中 0l[j]r[j]n10 \le l[j] \le r[j] \le n - 1v[j]0v[j] \ne 0。对于每个编号满足 l[j]kr[j]l[j] \le k \le r[j] 的盒子 kk

  • 如果 v[j]>0v[j] > 0,Khong 阿姨将糖果一块接一块地放入第 kk 个盒子,直到她正好放了 v[j]v[j] 块糖果或者该盒子已满。也就是说,如果该盒子在这次操作之前已有 pp 块糖果,那么在这次操作之后盒子将有 min(c[k],p+v[j])\min{(c[k], p + v[j])} 块糖果。
  • 如果 v[j]<0v[j] < 0,Khong 阿姨将糖果一块接一块地从第 kk 个盒子取出,直到她正好从盒子中取出 v[j]-v[j] 块糖果或者该盒子已空。也就是说,如果该盒子在这次操作之前已有 pp 块糖果,那么在这次操作之后盒子将有 max(0,p+v[j])\max{(0, p + v[j])} 块糖果。

你的任务是求出 qq 天之后每个盒子中糖果的数量。


实现细节

你要实现以下函数:

int[] distribute_candies(int[] c, int[] l, int[] r, int[] v)
  • c:一个长度为 nn 的数组。对于 0in10 \le i \le n - 1c[i]c[i] 表示盒子 ii 的容量。
  • lrv:三个长度为 qq 的数组。在第 jj 天,对于 0jq10 \le j \le q - 1,Khong 阿姨执行由整数 l[j]l[j]r[j]r[j]v[j]v[j] 决定的操作,如题面所述。

该函数应该返回一个长度为 nn 的数组。用 ss 表示这个数组。对于 0in10 \le i \le n - 1s[i]s[i] 应为 qq 天以后盒子 ii 中的糖果数量。


评测程序示例

评测程序示例读入如下格式的输入:

第 1 行: n
第 2 行: c[0] c[1] ... c[n - 1]
第 3 行: q
第 4 + j 行 (0 ≤ j ≤ q - 1): l[j] r[j] v[j]

评测程序示例按照以下格式打印你的答案:

第 1 行: s[0] s[1] ... 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])

这表示盒子 00 的容量为 1010 块糖果,盒子 11 的容量为 1515 块糖果,盒子 22 的容量为 1313 块糖果。

  • 在第 00 天结束时,盒子 00min(c[0],0+v[0])=10\min{(c[0], 0 + v[0])} = 10 块糖果,盒子 11min(c[1],0+v[0])=15\min{(c[1], 0 + v[0])} = 15 块糖果,盒子 22min(c[2],0+v[0])=13\min{(c[2], 0 + v[0])} = 13 块糖果。
  • 在第 11 天结束时,盒子 00max(0,10+v[1])=0\max{(0, 10 + v[1])} = 0 块糖果,盒子 11max(0,15+v[1])=4\max{(0, 15 + v[1])} = 4 块糖果。因为 2>r[1]2 > r[1],盒子 22 中的糖果数量没有变化。

每一天结束时糖果的数量总结如下:

盒子 0 盒子 1 盒子 2
0 10 15 13
1 0 4

就此情况,函数应该返回 [0, 4, 13]


数据范围与提示

对于所有数据:

  • 1n2000001 \le n \le 200\,000
  • 1q2000001 \le q \le 200\,000
  • 1c[i]1091 \le c[i] \le 10^9(对所有 0in10 \le i \le n - 1
  • 0l[j]r[j]n10 \le l[j] \le r[j] \le n - 1(对所有 0jq10 \le j \le q - 1
  • 109v[j]109-10^9 \le v[j] \le 10^9v[j]0v[j] \ne 0(对所有 0jq10 \le j \le q - 1

子任务

子任务 分值 特殊限制
1 3 n,q2000n, q \le 2000
2 8 v[j]>0v[j] > 0(对所有 0jq10 \le j \le q - 1
3 27 c[0]=c[1]==c[n1]c[0] = c[1] = \cdots = c[n - 1]
4 29 l[j]=0l[j] = 0r[j]=n1r[j] = n - 1(对所有 0jq10 \le j \le q - 1
5 33 没有额外的约束条件

注意:在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 11 及以上)

请在提交源代码前添加 #include "candies.h"