比换教室不知道低到哪里去了。
就二分一下第一个不满足的人,然后维护一个差分数组,diff[s[i]]+=d[i],diff[t[i]+1]-=d[i],然后把diff加起来,判断一下是否rest<现在的即可。
时间复杂度nlogn,就水过了。。。
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <cstring> using namespace std; const int N=1000005; int n,rest[N],d[N],s[N],t[N],dif[N],m; bool ck(int 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++) dif[i]+=dif[i-1]; for(int i=1;i<=n;i++) if(dif[i]>rest[i]) return 0; return 1; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&rest[i]); for(int i=1;i<=m;i++) scanf("%d%d%d",&d[i],&s[i],&t[i]); if(ck(m)){puts("0");return 0;} int l=1,r=m,ans=0; while(l<r) { int mid=l+r>>1; if(ck(mid)) {ans=mid+1,l=mid+1;} else r=mid; } cout<<"-1 "<<l<<endl; }