P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:二分+前缀和
我们将和质检员那题差不多,只需要将候选人二分即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int r[1000005];
int d[1000005];
int s[1000005];
int t[1000005];
int dif[1000005];
int sum[1000005];//差分数组的前缀和数组,统计每天至少要有多少凳子(需求数组
bool check(int x)//x表示的是订单数
{memset(dif,0,sizeof(dif));for(int i=1;i<=x;i++){dif[s[i]]+=d[i];dif[t[i]+1]-=d[i];}for(int i=1;i<=n;i++){sum[i]=sum[i-1]+dif[i];if(sum[i]>r[i])return false;}return true;
}
signed 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];}if(check(m)){cout<<0;return 0;}cout<<-1<<"\n";int l=1,r=m;int mid;while(l<=r){mid=(l+r)/2;if(check(mid)){l=mid+1;}else{r=mid-1;}}cout<<l;return 0;
}