洛谷借教室

题目

1.二分思想,while;
2.前缀和;用change数组储存教室数目的变化

#include<cstdio>
#include<cstring>
using namespace std;
int n,m,d[1000001],s[1000001],t[1000001],rest[1000001],change[1000001],need[1000001];
int check(int x){
	int i;
	memset(change ,0,sizeof(change));
	for(i=1;i<=x;i++){
		change[s[i]]+=d[i];
		change[t[i]+1]-=d[i];
	}
	for(i=1;i<=n;i++){
		need[i]=need[i-1]+change[i];
		if(need[i]>rest[i]) return 0;
	}
	 return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	int i;
	for(i=1;i<=n;i++){
		scanf("%d",&rest[i]);
	}
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&d[i],&s[i],&t[i]);
	}
	int l=1,r=m,mid;
	while(l<r){
		mid=(l+r)/2;
		if(check(mid)) l=mid+1;
		else r=mid;
	}
	if(l==m) printf("0");
	else printf("-1\n%d",l);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43880084/article/details/85198735