UOJ Logo Universal Online Judge

UOJ

#660. 【IOI2021】candies

附件下载 统计

由于某些原因本题仅支持 C++, C++11 语言的提交。

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

Khong 阿姨花了 q 天时间准备糖果盒。在第 j 天(0jq1),她根据三个整数 l[j]r[j]v[j] 执行操作,其中 0l[j]r[j]n1v[j]0。对于每个编号满足 l[j]kr[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 的数组。对于 0in1c[i] 表示盒子 i 的容量。
  • lrv:三个长度为 q 的数组。在第 j 天,对于 0jq1,Khong 阿姨执行由整数 l[j]r[j]v[j] 决定的操作,如题面所述。
  • 该函数应该返回一个长度为 n 的数组。用 s 表示这个数组。对于 0in1s[i] 应为 q 天以后盒子 i 中的糖果数量。

输入格式

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

  • 1 行:n
  • 2 行:c[0]c[1]c[n1]
  • 3 行:q
  • 4+j 行(0jq1):l[j]r[j]v[j]

输出格式

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

  • 1 行:s[0]s[1]s[n1]

样例一

input

3
10 15 13
2
0 2 20
0 1 -11

output

0 4 13

explanation

考虑如下调用:

distribute_candies([10, 15, 13], [0, 0], [2, 1], [20, -11])

这表示盒子 0 的容量为 10 块糖果,盒子 1 的容量为 15 块糖果,盒子 2 的容量为 13 块糖果。

在第 0 天结束时,盒子 0min(c[0],0+v[0])=10 块糖果,盒子 1min(c[1],0+v[0])=15 块糖果,盒子 2min(c[2],0+v[0])=13 块糖果。

在第 1 天结束时,盒子 0max(0,10+v[1])=0 块糖果,盒子 1max(0,15+v[1])=4 块糖果。因为 2>r[1],盒子 2 中的糖果数量没有变化。每一天结束时糖果的数量总结如下:

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

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

数据范围

对于所有数据:

  • 1n200000
  • 1q200000
  • 1c[i]109(对所有 0in1
  • 0l[j]r[j]n1(对所有 0jq1
  • 109v[j]109v[j]0(对所有 0jq1
子任务 分值 特殊限制
1 3 n,q2000
2 8 v[j]>0(对所有 0jq1
3 27 c[0]=c[1]==c[n1]
4 29 l[j]=0r[j]=n1(对所有 0jq1
5 33 没有额外的约束条件

时间限制:4s

空间限制:2GB