题解:本题主要考查差分+前缀和+二分。
简要题意:n天,第i天有ri个教室可借。有m份订单,某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室。求是否能满足。
1.差分和前缀和:因为需要对教室进行区域减,所以用差分和前缀和快速进行操作。
2.二分:在这里又学到了二分的一个条件:可以局部舍弃性。就可以二分序号快速找出答案。
代码如下:
#include<iostream>
#include <cstring>
using namespace std;
struct N
{
int l,r,ans;
}a[893758];
int n,m,mid,s,e;
int b[1998760],need[1325999],num[1999200];
bool v(int x)
{
memset(b,0,sizeof(b));
for(int i=1;i<=x;i++)
{
b[a[i].l]+=a[i].ans;
b[a[i].r+1]-=a[i].ans;
}
for(int i=1;i<=n;i++)
{
need[i]=need[i-1]+b[i];
if(need[i]>num[i])return 0;
}
return 1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>num[i];
for(int i=1;i<=m;i++)cin>>a[i].ans>>a[i].l>>a[i].r;
s=1;e=m;
if(v(m)==1){cout<<"0";return 0;}
while(s<e)
{
mid=(s+e)>>1;
if(v(mid)==1)
s=mid+1;
else e=mid;
}
cout<<"-1"<<endl<<s;
return 0;
}