差分及应用(3)差分解决问题(初步)

差分学完了,咱们来一道例题:

题目描述 Description

数学考试结束了,因为操作失误,有一些试卷的某些题目的分数没有加到试卷的总分上,现在老师一遍遍地检查试卷给某些试卷增加分数,最后需要知道这次考试的最低分是多少

输入描述 Input Description

第一行有两个正整数n和m表示学生数量和增加分数的次数。
第二行有n个数表示每个学生的初始成绩。
最后m行每行有三个数a b c,表示给第a个到第b个学生每人加了c分。

输出描述 Output Description

输出只有一个数字即全班最低分

样例输入 Sample Input

2 2

123 101

1 2 2

1 1 2

样例输出 Sample Output

103

数据范围及提示 Data Size & Hint

对于 40% 的数据,有 n≤10^3。

对于 60% 的数据,有 n≤10^4。

对于 80% 的数据,有 n≤10^5。

对于 100% 的数据,有 n≤5×10^6,m≤n,学生初始成绩 ≤100,c≤100。

可以看出数据量特别大,时间复杂度为O(n^2) (打不出次方)

所以只能用差分做。

  • 下标

    1

    2

    原数组a[i]

    123

    101

    差分(更改前)diff[i]

    123

    -22

    差分(更改后)diff[i]

    127

    -24

    x y z   

    1 2 2

    1 1 2

就是按照上次说的更改一下差分数组,在求个最小值就行了

#include<bits/stdc++.h>
using namespace std;
int n,m,a[5000005];
int diff[5000005];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		diff[i] = a[i]-a[i-1]; 
	}
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		diff[x]+=z;
		diff[y+1]-=z; 
	}
	int minn=INT_MAX;
	for(int i=1;i<=n;i++){
		a[i] = a[i-1]+diff[i]; 
		minn = min(minn,a[i]);
	}
	cout<<minn;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值