记录编号 335844 评测结果 AAAAAAAAAAT
题目名称 快速红包变换 最终得分 90
用户昵称 Gravatar白夜<=>黑天 是否通过 未通过
代码语言 C++ 运行时间 3.337 s
提交时间 2016-11-02 19:30:35 内存使用 12.88 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include <cstring>
  3. #define DEFUNC int,int,int,int
  4. #define a_tree int root,int l,int r
  5.  
  6. #define mid ((l+r)>>1)
  7.  
  8. #define this_tree root,l,r
  9. #define left_tree root<<1,l,mid
  10. #define right_tree root<<1|1,mid+1,r
  11.  
  12. #define left_son root<<1
  13. #define right_son root<<1|1
  14. const int MAXN=100010;
  15. const int INF=~0U>>1;
  16. const char *strc[]={"Cadd","Cchange","Cbmax","Cbmin","Qsum","Qwmax","Qwmin","Qnmax","Qnmin"};
  17. const int OPT []={ 1, 0, 3, 2, 2, 1, 0, 1, 0};
  18. const int CDD []={ 0, 0, 0, 0, 0, 0, 0, 1, 1};
  19. struct NODE{
  20. int num[2];
  21. NODE(int x=0,int y=0){num[0]=x;num[1]=y;}
  22. };
  23. int w[MAXN];
  24. bool operator <(NODE a,NODE b){return a.num[0]<b.num[0];}
  25. NODE min(NODE a,NODE b){return a.num[0]==b.num[0]?NODE(a.num[0],a.num[1]+b.num[1]):a<b?a:b;}
  26. NODE max(NODE a,NODE b){return a.num[0]==b.num[0]?NODE(a.num[0],a.num[1]+b.num[1]):a<b?b:a;}
  27. NODE sum(NODE a,NODE b){return NODE(a.num[0]+b.num[0],0);}
  28. NODE (*cmper[3])(NODE,NODE)={min,max,sum};
  29. NODE c[MAXN<<2][3];
  30. void rebuild(int);void push_down(int,int,int);
  31. void push_set(DEFUNC);void push_sum(DEFUNC);
  32. void push_max(DEFUNC);void push_min(DEFUNC);
  33. void (*push[4])(DEFUNC)={push_set,push_sum,push_min,push_max};
  34. int lazy[MAXN<<2][2];
  35. int ansl,ansr,number,N_cnt,opt,cdd;
  36. void push_set(a_tree,int val){
  37. c[root][0]=
  38. c[root][1]=NODE(val,r-l+1);
  39. c[root][2].num[0]=val*(r-l+1);
  40. lazy[root][1]=0;
  41. lazy[root][0]=val;
  42. }
  43. void push_sum(a_tree,int val){
  44. c[root][0].num[0]+=val;
  45. c[root][1].num[0]+=val;
  46. c[root][2].num[0]+=val*(r-l+1);
  47. lazy[root][1]+=val;
  48. }
  49. void push_min(a_tree,int val){
  50. if(c[root][1].num[0]<=val)return;
  51. if(c[root][0].num[0]>=val){
  52. push_set(this_tree,val);
  53. return;
  54. }if(l==r)return;
  55. push_down(this_tree);
  56. push_min(left_tree,val);
  57. push_min(right_tree,val);
  58. rebuild(root);
  59. }
  60. void push_max(a_tree,int val){
  61. if(c[root][0].num[0]>=val)return;
  62. if(c[root][1].num[0]<=val){
  63. push_set(this_tree,val);
  64. return;
  65. }if(l==r)return;
  66. push_down(this_tree);
  67. push_max(left_tree,val);
  68. push_max(right_tree,val);
  69. rebuild(root);
  70. }
  71. void rebuild(int root){
  72. for(int i=0;i<3;++i)
  73. c[root][i]=cmper[i](c[left_son][i],c[right_son][i]);
  74. }
  75. void push_down(a_tree){
  76. for(int i=0;i<2;++i)
  77. if(lazy[root][i]!=0){
  78. push[i](left_tree,lazy[root][i]);
  79. push[i](right_tree,lazy[root][i]);
  80. lazy[root][i]=0;
  81. }
  82. }
  83. void build(a_tree){
  84. if(l==r){
  85. for(int i=0;i<3;++i)
  86. c[root][i]=NODE(w[l],1);
  87. return ;
  88. }build(left_tree);
  89. build(right_tree);
  90. rebuild(root);
  91. }
  92. void change(a_tree){
  93. if(ansl<=l&&r<=ansr){
  94. push[opt](this_tree,number);
  95. return;
  96. }push_down(this_tree);
  97. if(ansl<=mid)change(left_tree);
  98. if(ansr> mid)change(right_tree);
  99. rebuild(root);
  100. }
  101. NODE query(a_tree){
  102. if(ansl<=l&&r<=ansr)
  103. return c[root][opt];
  104. push_down(this_tree);rebuild(root);
  105. if(ansr<=mid)return query(left_tree);
  106. if(ansl> mid)return query(right_tree);
  107. return cmper[opt](query(left_tree),query(right_tree));
  108. }
  109. int QUERY(int l,int r,int seq){
  110. ansl=l;ansr=r;opt=OPT[seq];cdd=CDD[seq];
  111. return query(1,1,N_cnt).num[cdd];
  112. }
  113. void CHANGE(int l,int r,int val,int seq){
  114. ansl=l;ansr=r;number=val;
  115. opt=OPT[seq];cdd=CDD[seq];
  116. change(1,1,N_cnt);
  117. }
  118. void BUILD(int N){
  119. N_cnt=N;build(1,1,N_cnt);
  120. }
  121. int main(){
  122. freopen("redbag.in","r",stdin);
  123. freopen("redbag.out","w",stdout);
  124. int N,M,x,y,z;
  125. char sc[7];
  126. scanf("%d",&N);
  127. for(int i=1;i<=N;++i)
  128. scanf("%d",&w[i]);
  129. BUILD(N);scanf("%d",&M);
  130. for(int i=1;i<=M;++i){
  131. scanf("%s",sc);
  132. for(int j=0;j<9;++j){
  133. if(strcmp(sc,strc[j])==0){
  134. if(*sc=='C'){
  135. scanf("%d%d%d",&x,&y,&z);
  136. CHANGE(x,y,z,j);
  137. }else {
  138. scanf("%d%d",&x,&y);
  139. printf("%d\n",QUERY(x,y,j));
  140. }break;
  141. }
  142. }
  143. }
  144. return 0;
  145. }