loj#P3523. 「IOI2021」分糖果

「IOI2021」分糖果

题目描述

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

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

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

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 阿姨将糖果一块接一块地从第 k 个盒子取出,直到她正好从盒子中取出 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)
  • cc:一个长度为 nn 的数组。对于 0in10 \le i \le n - 1c[i]c[i] 表示盒子 ii 的容量。
  • llrrvv:三个长度为 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 中的糖果数量。

评测程序示例

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

  • 11 行:nn
  • 22 行:c[0]  c[1]    c[n1]c[0] \; c[1] \; \ldots \; c[n - 1]
  • 33 行:qq
  • 4+j4 + j 行(0jq10 \le j \le q - 1):l[j]  r[j]  v[j]l[j] \; r[j] \; v[j]

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

  • 11 行:s[0]  s[1]    s[n1]s[0] \; s[1] \; \ldots \; s[n - 1]
3
10 15 13
2
0 2 20
0 1 -11

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
子任务 分值 特殊限制
11 33 n,q2000n, q \le 2000
22 88 v[j]>0v[j] > 0(对所有 0jq10 \le j \le q - 1
33 2727 c[0]=c[1]==c[n1]c[0] = c[1] = \cdots = c[n - 1]
44 2929 l[j]=0l[j] = 0r[j]=n1r[j] = n - 1(对所有 0jq10 \le j \le q - 1
55 3333 没有额外的约束条件