首页 > 其他分享 >P2367 语文成绩

P2367 语文成绩

时间:2024-05-01 12:34:08浏览次数:13  
标签:10 语文 le P2367 5000010 成绩

P2367 语文成绩

题目

语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?

输入

第一行有两个整数 \(n\),\(p\),代表学生数与增加分数的次数。

第二行有 \(n\) 个数,\(a_1 \sim a_n\),代表各个学生的初始成绩。

接下来 \(p\) 行,每行有三个数,\(x\),\(y\),\(z\),代表给第 \(x\) 个到第 \(y\) 个学生每人增加 \(z\) 分。

输出

输出仅一行,代表更改分数后,全班的最低分。

样例

输入

3 2
1 1 1
1 2 1
2 3 1

输出

2

提示

对于 \(40\%\) 的数据,有 \(n \le 10^3\)。

对于 \(60\%\) 的数据,有 \(n \le 10^4\)。

对于 \(80\%\) 的数据,有 \(n \le 10^5\)。

对于 \(100\%\) 的数据,有 \(n \le 5\times 10^6\),\(p \le n\),学生初始成绩 $ \le 100\(,\)z \le 100$。


思路

分析题意,知道老师要对某些区间进行加法操作,如果暴力计算会超时,于是转换为差分数组操作,最后做前缀和得到最终的结果。将问题转换为序列的差分问题,对差分数组区间位置的元素做“\(+z,-z\)”操作


代码

#include <bits/stdc++.h>

using namespace std;

int n, m, a[5000010], c[5000010], sum[5000010], mn = 0x3f3f3f3f, x, y, z;

int main()
{
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i ++ )
	{
		scanf("%d", &a[i]);
		c[i] = a[i] - a[i - 1];
	}
	for (int i = 1; i <= m; i ++ )
	{
		scanf("%d %d %d", &x, &y, &z);
		c[x] += z;
		c[y + 1] -= z;
	}
	for (int i = 1; i <= n; i ++ )
	{
		sum[i] = sum[i - 1] + c[i];
		if (sum[i] < mn)
			mn = sum[i];
	}
	printf("%d", mn);
	return 0;
}

标签:10,语文,le,P2367,5000010,成绩
From: https://www.cnblogs.com/IronMan-PZX/p/18169243

相关文章