题意
- 第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;
}