差分学完了,咱们来一道例题:
题目描述 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;
}