P2367 语文成绩
题目描述
语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?
tips:
1、这又跟神器有什么关系呢?神说:呵呵。
2、因为n和p的范围比较大 建议C++选手使用$scanf$读入。
3、同时建议写读入优化….
4、最后一个点,亲测$pas$读入$800+ms$,$c/c++$的$scanf $$1200+ms$,所以这个点的时限改为$2s$。
输入输出格式
输入格式
第一行有两个整数$n$,$p$,代表学生数与增加分数的次数。
第二行有$n$个数,$a_1-a_n$,代表各个学生的初始成绩。
接下来$p$行,每行有三个数,$x$,$y$,$z$,代表给第x个到第y个学生每人增加$z$分。
输出格式
输出仅一行,代表更改分数后,全班的最低分。
输入输出样例
INPUT #1
1 | 3 2 |
OUTPUT #1
1 | 2 |
说明
对于40%的数据,有$n\leq1000$
对于60%的数据,有$n\leq10000$
对于80%的数据,有$n\leq100000$
对于100%的数据,有$n\leq5000000$,$p\leq n$,学生初始成绩$\leq100$,$z\leq100$
分析
先来看原题:
每行有三个数,$x$,$y$,$z$,代表给第$x$个到第$y$个学生每人增加$z$分。
第$x$个到第$y$个学生每人增加$z$分?,区间修改!
果断线段树啊QAQ。
但,
读完题目,我们就会发现只需要在最后求出最小值,并不需要有其他操作
所以线段树这样的算法自然会被pass掉。
而且数据范围:
$$n\leq5000000,p\leq n$$
线段树的数组需要开到segment_tree[maxn<<2]
也就是$2e8$左右,绝对会MLE。
算法
自然是差分。
这样$O(n)$的时间复杂度就可以轻松解决了。
代码实现
1 | /* Headers */ |
再来看一下$tips$:
同时建议写读入优化….
快读/写
直接上代码:
1 | namespace FastIO{ |
至于$fread$,指点迷津之地。
以下摘自王太阳题解。
1 | namespace FastIO { |