记录编号 67906 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2012]借教室 最终得分 100
用户昵称 GravatarHobo 是否通过 通过
代码语言 C++ 运行时间 2.531 s
提交时间 2013-08-15 13:49:00 内存使用 16.48 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <algorithm>
  6. #define ULL unsigned long long
  7. #define MAXN 1000000+10
  8. using namespace std;
  9. int N,M,L,R,NOW,K,SSUM,ROOM[MAXN],D[MAXN],S[MAXN],T[MAXN],SUM[MAXN];
  10. bool F;
  11.  
  12. void init()
  13. {
  14. cin>>N>>M;
  15. for (int i=1;i<=N;i++) scanf("%d",&ROOM[i]);
  16. for (int i=1;i<=M;i++) scanf("%d%d%d",&D[i],&S[i],&T[i]);
  17. }
  18.  
  19. void print()
  20. {
  21. cout<<"0"<<endl;
  22. exit(0);
  23. }
  24.  
  25. void work()
  26. {
  27. NOW=0;
  28. L=0;
  29. R=M+1;
  30. do {
  31. F=1;
  32. K=(L+R)>>1;
  33. if (K>NOW)
  34. for (int i=NOW+1;i<=K;i++)
  35. {
  36. SUM[S[i]]+=D[i];
  37. SUM[T[i]+1]-=D[i];
  38. }
  39. else
  40. for (int i=K+1;i<=NOW;i++)
  41. {
  42. SUM[S[i]]-=D[i];
  43. SUM[T[i]+1]+=D[i];
  44. }
  45. NOW=K;
  46. SSUM=0;
  47. for (int i=1;i<=N;i++)
  48. {
  49. SSUM+=SUM[i];
  50. if (SSUM>ROOM[i]) {F=0;break;}
  51. }
  52. if (F) L=K+1; else R=K;
  53. }
  54. while (L!=R);
  55. if (K==M && F) print();
  56. cout<<"-1"<<endl;
  57. cout<<L;
  58. }
  59.  
  60. int main()
  61. {
  62. freopen("classrooms.in","r",stdin);
  63. freopen("classrooms.out","w",stdout);
  64. init();
  65. work();
  66. return 0;
  67. }