一般的暴力做法肯定就是枚举订单,看满足这个订单及之前订单的情况下会不会有教室借不了(为什么不考虑后面的教室呢?因为问的就是第一个不满足的订单,我刚开始就是没读懂题意)
然后标准二分模型枚举订单。
然后是差分,再求差分的前缀和得到每个教室的占用情况,再来跟原来的情况对比,进行二分判断
具体见代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int l,ri,mid; int n,m;
int f[1001000];
int r[1001000],d[1001000],s[1001000],t[1001000];
bool check(int mid)
{
memset(f,0,sizeof(f));
for(int i=1;i<=mid;i++)
{
f[s[i]]+=d[i];
f[t[i]+1]-=d[i];
}
if(f[1]>r[1])
{
return 1;
}
for(int i=2;i<=n;i++)
{
f[i]+=f[i-1];
if(f[i]>r[i])
{
return 1;
}
}
return 0;
}
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",&d[i],&s[i],&t[i]);
}
l=1,ri=m;
while(l<ri)
{
mid=(l+ri)/2;
if(check(mid))
{
ri=mid;
}
else l=mid+1;
}
if(m!=ri)
{
printf("-1\n");
printf("%d",ri);
}
else
{
printf("0");
}
}