题意

  • 第i天有Ri个教室可以借出,一共有m次操作,每次操作以(x,y,z)形式给出,代表从y天到z天要借出x个教室,判断教室够不够用,如果不够,输出第一次不够的操作的序号

思路

  • 正常读入该读入的东西
  • 二分第次天会出问题,将这一次前(包含这一次)的操作做完
  • 检测有无教室不够

AC代码

#include<bits/stdc++.h>
using namespace std;

typedef struct{
	int d,s,t;
}L;
int n,m,delta[1010101],R[1010101];
L lend[1010101];

int judge(int mid){
	memset(delta,0,sizeof(delta));
	for(int i=1;i<=mid;i++){
		delta[lend[i].s]+=lend[i].d;
		delta[lend[i].t+1]-=lend[i].d;
	}
	long long sum=0;
	for(int i=1;i<=n;i++){
		sum+=delta[i];
		if(R[i]-sum<0)return 0;
	}
	return 1;
}
int main(){
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&R[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&lend[i].d,&lend[i].s,&lend[i].t);
	}
	int l=0,r=m;
	while(l<=r){
		int mid=(l+r)>>1;
		if(judge(mid)){
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	if(l>m)printf("0\n");
	else printf("%d\n",l);
	return 0;
}