本题要找第几个安排是无法完成的,可以反着想,设前k个订单是符合要求的,因此把前k个订单的l,r加到一个空数组中,则这个数组前k个数的每个值都应该小于等于每天的空教室数量,每次从l加到r,会超时,所以联想一下,从l到r每个数都加上一个数,这正是差分。要找到这个k,可以用二分算法,因为若前k个订单满足,则前k个每个订单一定满足,第k+1个开始一定不满足。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int a[N],n,m,d[N],l[N],r[N],b[N];
bool check(int mid)
{
memset(b,0,sizeof b);
for(int i=1;i<=mid;i++)//差分操作
{
b[l[i]]+=d[i];
b[r[i]+1]-=d[i];
}
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=b[i];//sum为第i个
if(sum>a[i])return false;
}
return true;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=m;i++)scanf("%lld%lld%lld",&d[i],&l[i],&r[i]);
int l=0,r=m;
while(l<r)//用找较大值的模板
{
int mid=l+r+1>>1;
if(check(mid))l=mid;
else r=mid-1;
}
if(r==m)cout<<0;
else cout<<-1<<endl<<r+1<<endl;
return 0;
}