记录编号 427726 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2012]借教室 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 1.078 s
提交时间 2017-07-22 23:43:17 内存使用 17.43 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cctype>
  3. const int maxn=1e6+5;
  4. using namespace std;
  5. inline int get();
  6. int n,m;
  7. int r[maxn],d[maxn],s[maxn],t[maxn],now[maxn];
  8. int main()
  9. {
  10. freopen("classrooms.in","r",stdin);
  11. freopen("classrooms.out","w",stdout);
  12. n=get();m=get();
  13. for(int i=1;i<=n;i++)r[i]=get();
  14. for(int i=1;i<=m;i++)d[i]=get(),s[i]=get(),t[i]=get();
  15. int l=1,rr=m;
  16. for(;l<rr;)
  17. {
  18. int mid=(l+rr)>>1;
  19. for(int ll=l;ll<=mid;ll++)now[s[ll]]+=d[ll],now[t[ll]+1]-=d[ll];
  20. long long sum=0;bool jud=0;
  21. for(int i=1;i<=n;i++)
  22. {
  23. sum+=now[i];
  24. if(sum>r[i])
  25. {
  26. jud=1;
  27. break;
  28. }
  29. }
  30. if(!jud)l=mid+1;
  31. else
  32. {
  33. rr=mid;
  34. for(int ll=l;ll<=mid;ll++)now[s[ll]]-=d[ll],now[t[ll]+1]+=d[ll];
  35. }
  36. }
  37. if(l==m)printf("0");
  38. else printf("-1\n%d",l);
  39. return 0;
  40. }
  41. inline int get()
  42. {
  43. int t=0,j=1;char c=getchar();
  44. while(!isdigit(c))
  45. {
  46. if(c=='-')j=-1;
  47. c=getchar();
  48. }
  49. while(isdigit(c))
  50. {
  51. t=(t<<3)+(t<<1)+c-'0';
  52. c=getchar();
  53. }
  54. return j*t;
  55. }