P2367 语文成绩
题目:
语文成绩
题目背景
语文考试结束了,成绩还是一如既往地有问题。
题目描述
语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?
输入格式
第一行有两个整数 n,p,代表学生数与增加分数的次数。
第二行有 n 个数,a_1 \sim a_n,代表各个学生的初始成绩。
接下来 p 行,每行有三个数,x,y,z,代表给第 x个到第 y 个学生每人增加 z 分。
输出格式
输出仅一行,代表更改分数后,全班的最低分。
样例 #1
样例输入 #1
3 2
1 1 1
1 2 1
2 3 1
样例输出 #1
2
思路:
差分题
差分公式有:arr[i] - arr[i-1] = drr[i]
首先一个差分数组 drr 保存2个数之间的差,
然后根据给定的范围a,b,c, 更改drr数组的值:
左端点是加上c,便可求出区间内的其他数 drr[a] += c
右端点后一个数减去c,可得到右端点的新值,也代表这个区间结束 drr[b+1] -= c;
方法一:
点击查看代码
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define lop(i,a,b) for(int i = (a); i < (b); i++)
#define dwn(i,a,b) for(int i = (a); i >= (b); i--)
#define mset(t,x) memset(t,x,sizeof(t));
#define ll long long
#define el '\n'
using namespace std;
const int N = 5E6 + 5;
int n, m;
int arr[N], drr[N];
void solve()
{
cin >> n >> m;
rep(i, 1, n) {//读入数据
cin >> arr[i];
drr[i] = arr[i] - arr[i - 1];//差分数组
}
rep(i, 1, m) {
int a, b, c;
cin >> a >> b >> c;
drr[a] += c;//更改差分数组的值来更改区间的值
drr[b + 1] -= c;
}
int minn = 100;
rep(i, 1, n) {
arr[i] = arr[i - 1] + drr[i];//利用差分公式求新的值
minn = min(arr[i], minn);
}
cout << minn;
}
int main()
{
ios;
solve();
return 0;
}