这里是语文成绩的个人题解
首先这题一看就知道用差分*(虽然有大佬用了啥别的高级玩意,但是我不知道我当时看见题想的就是刚学的前缀和)*
#include <stdio.h>
int main(void) {
long int n, p;
scanf("%d %d", &n, &p);
int b[n + 1]; //m临时储存a的值
int a, z;
int c = 0;
for (int i = 0; i < n; i++) {//差分法
scanf("%d", &a);
b[i] = a - c;
c = a;
}
long int x, y;
for (int i = 0; i < p; i++) {//输入两断点及变化量
scanf("%ld %ld %d", &x, &y, &z);
b[x - 1] += z;
if (y < n)
b[y] -= z;
}
int m = b[0] ;
int min = m;//暂时储存a值,可简化
for (int i = 1; i < n; i++) {//比较最小值
m += b[i] ;
if (m < min)
min = m;
}
printf("%d", min);
return 0;
}
感觉这题知道了差分之后做的就很快了,直接往里面套就完了
感觉这么结束有点潦草,决定简单写写差分
差分
差分可以改变一个区间的量,比如给区间[1,100]
全部加1,暴力需要依次加一,差分只要构造差分数列,然后再两端端点加一,最后将差分数列重新重组为数列即可
-
差分数组
原数组
a[i]
构造数组b[i]
二者关系:
a[i]=b[1]+b[2]........b[i]
b[n]=a[n]-a[n-1]
-
两端点
给
a
数组中的[ 1,100]
区间中的每一个数都加上1
,只需对差分数组b
做b[1] + = c
,b[100] - = c
即可
最后
在找做法的时候发现这个讲的前缀和和差分很详细
链接:https://blog.csdn.net/weixin_45629285/article/details/111146240