洛谷借教室
阿新 • • 發佈:2018-12-28
1.二分思想,while;
2.字首和;用change陣列儲存教室數目的變化
#include<cstdio> #include<cstring> using namespace std; int n,m,d[1000001],s[1000001],t[1000001],rest[1000001],change[1000001],need[1000001]; int check(int x){ int i; memset(change ,0,sizeof(change)); for(i=1;i<=x;i++){ change[s[i]]+=d[i]; change[t[i]+1]-=d[i]; } for(i=1;i<=n;i++){ need[i]=need[i-1]+change[i]; if(need[i]>rest[i]) return 0; } return 1; } int main(){ scanf("%d%d",&n,&m); int i; for(i=1;i<=n;i++){ scanf("%d",&rest[i]); } for(i=1;i<=m;i++){ scanf("%d%d%d",&d[i],&s[i],&t[i]); } int l=1,r=m,mid; while(l<r){ mid=(l+r)/2; if(check(mid)) l=mid+1; else r=mid; } if(l==m) printf("0"); else printf("-1\n%d",l); return 0; }