Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. //Bismillahir Rahmanir Rahim
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <cctype>
  7. #include <cstdlib>
  8. #include <vector>
  9. #include <string>
  10. #include <cstring>
  11. #include <queue>
  12. #include <set>
  13. #include <stack>
  14. #include <map>
  15. #include <sstream>
  16. using namespace std;
  17. long long tree[1000009],ar[1000009],now[2000009],inf,keep[200009],use;
  18. void init()
  19. {
  20. memset(tree,0,sizeof(tree));
  21. memset(ar,-inf,sizeof(ar));
  22. }
  23. void godown(long long node, long long beg,long long end)
  24. {
  25. if(ar[node]==-inf) return;
  26. long long mid;
  27. mid=beg+end;
  28. mid=mid/2;
  29. tree[node*2]=(mid-beg+1)*ar[node];
  30. tree[node*2+1]=(end-mid)*ar[node];
  31. ar[node*2]=ar[node];
  32. ar[node*2+1]=ar[node];
  33. ar[node]=-inf;
  34. return;
  35. }
  36. void goup(long long node, long long beg,long long end)
  37. {
  38. tree[node]=tree[node*2]+tree[node*2+1];
  39. }
  40. void update(long long node,long long beg,long long end,long long i, long long j, long long value)
  41. {
  42. if(beg>j || end<i) return ;
  43. if(beg>=i && end<=j)
  44. {
  45. tree[node]=(end-beg+1)*value;
  46. ar[node]=value;
  47. return ;
  48. }
  49. godown(node,beg,end);
  50. long long mid;
  51. mid=beg+end;
  52. mid=mid/2;
  53. update(node*2,beg,mid,i,j,value);
  54. update(node*2+1,mid+1,end,i,j,value);
  55. goup(node,beg,end);
  56. }
  57. long long query(long long node,long long beg,long long end,long long i,long long j)
  58. {
  59. if(beg>j || end<i) return 0;
  60. if(beg>=i && end<=j)
  61. {
  62. return tree[node];
  63. }
  64. godown(node,beg,end);
  65. long long mid;
  66. mid=beg+end;
  67. mid=mid/2;
  68. long long sum=0;
  69. sum=sum+query(node*2,beg,mid,i,j);
  70. sum=sum+query(node*2+1,mid+1,end,i,j);
  71. return sum;
  72. }
  73. long long check(long long low,long long high,long long n,long long beg,long long end,long long tar)
  74. {
  75. long long temp;
  76. if(low==high) return low;
  77. if(low==high-1)
  78. {
  79. temp=query(1,1,n,beg,high);
  80. use=temp;
  81. temp=temp+(end-(high+1)+1)*tar;
  82. if(temp<0)
  83. return high;
  84. return low;
  85. }
  86. long long mid;
  87. mid=low+high;
  88. mid=mid/2;
  89. temp=query(1,1,n,beg,mid);
  90. temp=temp+(end-(mid+1)+1)*tar;
  91. if(temp<0) return check(mid,high,n,beg,end,tar);
  92. return check(low,mid,n,beg,end,tar);
  93. }
  94. int main()
  95. {
  96. long long a,s,d,f,g,h,j,k,l,low;
  97. for(a=1;a<=50;a++) inf=inf*2;
  98. low=inf;
  99. cin>>a>>s;
  100. init();
  101. for(d=1;d<=a;d++)
  102. {
  103. cin>>keep[d];
  104. low=min(low,keep[d]);
  105. update(1,1,a,d,d,keep[d]);
  106. }
  107. if(s==1)
  108. {
  109. for(d=1;d<=a;d++)
  110. {
  111. if(keep[d]>=0) now[d]=-1;
  112. else now[d]=keep[d];
  113. }
  114. l=0;
  115. for(d=1;d<=a;d++)
  116. {
  117. l=l+abs(now[d]-keep[d]);
  118. }
  119. cout<<l<<endl;
  120. for(d=1;d<=a;d++)
  121. {
  122. cout<<now[d];
  123. if(d==a) cout<<endl;
  124. else cout<<" ";
  125. }
  126. return 0;
  127. }
  128. long long q,last;
  129. last=-1;
  130. for(d=1;d<=a-s+1;d++)
  131. {
  132. f=query(1,1,a,d,d+s-1);
  133. if(f<0) continue;
  134. if(last<d) g=check(d,d+s-1,a,d,d+s-1,low);
  135. else g=check(last,d+s-1,a,d,d+s-1,low);
  136. last=d+s-1;
  137. q=query(1,1,a,d,g);
  138. q=q+low*((d+s-1)-(g+1)+1);
  139. if(q<0)
  140. {
  141. update(1,1,a,g+2,d+s-1,low);
  142. k=(d+s-1-(g+2)+1)*low;
  143. j=query(1,1,a,d,g);
  144. l=-1-k-j;
  145. update(1,1,a,g+1,g+1,l);
  146. }
  147. else
  148. {
  149. update(1,1,a,g+1,d+s-1,low);
  150. h=(d+s-1-(g+1)+1)*low;
  151. j=-1-h;
  152. update(1,1,a,g,g,j);
  153. }
  154. }
  155. l=0;
  156. for(d=1;d<=a;d++)
  157. {
  158. now[d]=query(1,1,a,d,d);
  159. l=l+abs(now[d]-keep[d]);
  160. }
  161. cout<<l<<endl;
  162. for(d=1;d<=a;d++)
  163. {
  164. int temp;
  165. temp=now[d];
  166. printf("%d",temp);
  167. if(d==a) printf("\n");
  168. else printf(" ");
  169. }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement