题意:
n天,每天有r[i]个教室出租,一共m个订单,按照先后顺序,每个订单从s天开始到t天结束,每天要借d个,如果所有订单都能完成,输出0,哪天教室不够,输出到那个订单的单号。
思路:
二分可以完成到第几个订单,对于每个二分的值,进行差分到这个订单为止所有的天数,求下前缀和,就可以得出对于每一天有没有超出借出的教室的数量。
#include<iostream>
#include<cstring>
using namespace std;
int r[1000010],s[1000010],t[1000010],d[1000010],num[1000010],sum[1000010];
int n,m;
int mins(int now){
memset(num,0,sizeof(num));
for(int i=1;i<=now;i++){
num[s[i]]+=d[i];
num[t[i]+1]-=d[i];
}
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+num[i];
if(sum[i]>r[i])return 0;
}
return 1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>r[i];
}
for(int i=1;i<=m;i++){
cin>>d[i]>>s[i]>>t[i];
}
int l=1,r=m;
while(l<r){
int mid=(l+r)/2;
if(mins(mid))l=mid+1;
else r=mid;
}
if(m!=r){
cout<<-1<<endl;
cout<<r<<endl;
}
else{
cout<<0<<endl;
}
return 0;
}