记录编号 118274 评测结果 AAAAAAAAAAAAAA
题目名称 线段覆盖 最终得分 100
用户昵称 GravatarHouJikan 是否通过 通过
代码语言 C++ 运行时间 1.941 s
提交时间 2014-09-05 21:21:28 内存使用 7.19 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <stack>
  9. #include <map>
  10. #include <set>
  11. #include <list>
  12. #include <vector>
  13. #include <ctime>
  14. #include <iterator>
  15. #include <functional>
  16. #define pritnf printf
  17. #define scafn scanf
  18. #define For(i,j,k) for(int i=(j);i<=(k);(i)++)
  19. using namespace std;
  20. typedef long long LL;
  21. typedef unsigned int Uint;
  22. const int INF=0x7ffffff;
  23. //==============struct declaration==============
  24.  
  25. //==============var declaration=================
  26. const int MAXN=200100;
  27. int n,q,cmd;
  28. int maxv[MAXN*2],minv[MAXN*2],leftc[MAXN*2],rightc[MAXN*2],addv[MAXN];
  29. #define y1 y
  30. int y1,y2;
  31. //==============function declaration============
  32. void update(int o,int l,int r);//将y1..y2全部++
  33. void maintain(int o,int l,int r);//更新节点
  34. int query(int o,int l,int r,int add);//求黑色块数
  35. int cons(int o,int l,int r,int add);//求连续黑色块数
  36. //==============main code=======================
  37. int main()
  38. {
  39. string FileName="xdfg";//程序名
  40. string FloderName="COGS";//文件夹名
  41. freopen((FileName+".in").c_str(),"r",stdin);
  42. freopen((FileName+".out").c_str(),"w",stdout);
  43. #ifdef DEBUG
  44. system(("cp C:\\Users\\Administrator\\Desktop\\"+FloderName+"\\standard.cpp C:\\Users\\Administrator\\Desktop\\"+FloderName+"\\submit.txt").c_str());
  45. clock_t Start_Time=clock();
  46. #endif
  47. memset(minv,0,sizeof(minv));
  48. memset(maxv,0,sizeof(maxv));
  49. memset(addv,0,sizeof(addv));
  50. memset(leftc,0,sizeof(leftc));
  51. memset(rightc,0,sizeof(rightc));
  52. scanf("%d%d",&n,&q);
  53. For(i,1,q)
  54. {
  55. scanf("%d%d%d",&cmd,&y1,&y2);
  56. y2=y1+y2-1;
  57. update(1,1,n);
  58. printf("%d ",cons(1,1,n,0));
  59. printf("%d\n",query(1,1,n,0));
  60. }
  61. #ifdef DEBUG
  62. clock_t End_Time=clock();
  63. cout<<endl<<endl<<"Time Used: "<<(End_Time-Start_Time)/CLOCKS_PER_SEC<<endl;
  64. #endif
  65. return 0;
  66. }
  67. //================fuction code====================
  68. void maintain(int o,int l,int r)
  69. {
  70. if (l==r)
  71. {
  72. maxv[o]=minv[o]=leftc[o]=rightc[o]=addv[o];
  73. return;
  74. }
  75. int lc=o*2;
  76. int rc=o*2+1;
  77. maxv[o]=max(maxv[lc],maxv[rc])+addv[o];
  78. minv[o]=min(minv[lc],minv[rc])+addv[o];
  79. leftc[o]=leftc[lc]+addv[o];
  80. rightc[o]=rightc[rc]+addv[o];
  81. }
  82. void update(int o,int l,int r)//全体++;
  83. {
  84. int lc=o*2;
  85. int rc=o*2+1;
  86. int m=(l+r)>>1;
  87. if (y1<=l&&r<=y2)
  88. {
  89. if (cmd==1) addv[o]++;
  90. if (cmd==2) addv[o]--;
  91. }
  92. else
  93. {
  94. if (m>=y1)
  95. update(lc,l,m);
  96. if (m<y2)
  97. update(rc,m+1,r);
  98. }
  99. maintain(o,l,r);
  100. }
  101. int query(int o,int l,int r,int add)
  102. {
  103. int lc=o*2;
  104. int rc=o*2+1;
  105. int m=(l+r)>>1;
  106. if (minv[o]+add+addv[o]>0)
  107. return r-l+1;
  108. if (maxv[o]+add+addv[o]==0)
  109. return 0;
  110. int res=0;
  111. res+=query(lc,l,m,add+addv[o]);
  112. res+=query(rc,m+1,r,add+addv[o]);
  113. return res;
  114. }
  115. int cons(int o,int l,int r,int add)
  116. {
  117. int lc=o*2;
  118. int rc=o*2+1;
  119. int m=(l+r)>>1;
  120. if (minv[o]+add>0)
  121. return 1;
  122. if (maxv[o]+add==0)
  123. return 0;
  124. int res=0;
  125. res+=cons(lc,l,m,add+addv[o]);
  126. res+=cons(rc,m+1,r,add+addv[o]);
  127. if (rightc[lc]+addv[o]&&leftc[rc]+addv[o])
  128. res--;
  129. return res;
  130. }