这里是语文成绩的个人题解

这里是语文成绩的个人题解

首先这题一看就知道用差分*(虽然有大佬用了啥别的高级玩意,但是我不知道我当时看见题想的就是刚学的前缀和)*

#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,暴力需要依次加一,差分只要构造差分数列,然后再两端端点加一,最后将差分数列重新重组为数列即可

  1. 差分数组

    原数组a[i] 构造数组b[i]

    二者关系:a[i]=b[1]+b[2]........b[i]

    b[n]=a[n]-a[n-1]

  2. 两端点

    a数组中的[ 1,100] 区间中的每一个数都加上1,只需对差分数组bb[1] + = c, b[100] - = c即可

最后

在找做法的时候发现这个讲的前缀和和差分很详细
链接:https://blog.csdn.net/weixin_45629285/article/details/111146240

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值