P2367 语文成绩

118 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

语文成绩

题目背景

语文考试结束了,成绩还是一如既往地有问题。

题目描述

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

输入格式

第一行有两个整数 nnpp,代表学生数与增加分数的次数。

第二行有 nn 个数,a1ana_1 \sim a_n,代表各个学生的初始成绩。

接下来 pp 行,每行有三个数,xxyyzz,代表给第 xx 个到第 yy 个学生每人增加 zz 分。

输出格式

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

样例 #1

样例输入 #1

3 2
1 1 1
1 2 1
2 3 1

样例输出 #1

2

提示

对于 40%40\% 的数据,有 n103n \le 10^3

对于 60%60\% 的数据,有 n104n \le 10^4

对于 80%80\% 的数据,有 n105n \le 10^5

对于 100%100\% 的数据,有 n5×106n \le 5\times 10^6pnp \le n,学生初始成绩 100 \le 100z100z \le 100

分析

qaq这题暴力肯定是不行的,肯定会超时,对于这种多询问问题,差分是很好的做法,然后边差分,边找出最小值就ok啦。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string> 
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack> 
#include <cmath>
#define int long long
#define AC return
#define Please 0
using namespace std;
const int N=5e6+10;
int fa[N]; 
typedef pair<int,int>PII;
int a[N],b[N];
inline int read(){//快读 
	int x=0,f=1;char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=x*10+ch-'0'; 
		ch=getchar();
	}
	AC x*f;
}
inline void insert(int l,int r,int c){
	b[l]+=c;
	b[r+1]-=c;
}
signed main(){
	int n,p;
	n=read(),p=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	} 
	for(int i=1;i<=n;i++){
		insert(i,i,a[i]);
	}
	while(p--){
		int l,r,c;
		cin>>l>>r>>c;
		insert(l,r,c);
	}
	for(int i=1;i<=n;i++){
		a[i]=a[i-1]+b[i];
	}
	int minn=0x3f3f3f3f;
	for(int i=1;i<=n;i++){
		minn=min(minn,a[i]);
	}
	cout<<minn<<endl;
	AC Please;
}

希望能帮助到大家(qaqqaq)!