题目:
题解:
1.当出现第一个不满足的订单后,后面的订单都是不满足的,所以可以通过二分答案找到第一个不满足的订单,因为每次都是从前往后借教室所以要把每次的操作存储一下。
2.每次借用教室的时候对应区间的教室数量会减少是区间修改可以使用差分。
时间复杂度是:O( n log n )
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
using ll=long long;
int n,m;
int q[N],d[N],s[N],t[N];
ll b[N];
bool check(int mid){
for(int i=1;i<=n;i++)b[i]=q[i]-q[i-1];
for(int i=1;i<=mid;i++){
b[s[i]]-=d[i];
b[t[i]+1]+=d[i];
}
for(int i=1;i<=n;i++){
b[i]+=b[i-1];
if(b[i]<0)return true;
}
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",q+i);
for(int i=1;i<=m;i++)scanf("%d%d%d",d+i,s+i,t+i);
if(!check(m)){
printf("0");
return 0;
}
int l=1,r=m,mid;
while(l<r){
mid=r+l>>1;
if(check(mid))r=mid;
else l=mid+1;
}
printf("-1\n");
printf("%d",l);
return 0;
}