Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.69 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstring>
  5. #include<queue>
  6. #include<map>
  7. #include<set>
  8. #include<algorithm>
  9. #include<stack>
  10. #include<cmath>
  11. #include<iomanip>
  12. #include<cstdlib>
  13. #include<sstream>
  14. using namespace std;
  15. #define f(i,a,b) for(i=a;i<b;i++)
  16. #define rep(i,n) f(i,0,n)
  17. #define pb push_back
  18. #define ss second
  19. #define ff first
  20. #define vi vector<int>
  21. #define vl vector<ll>
  22. #define s(n) scanf("%d",&n)
  23. #define ll long long
  24. #define mp make_pair
  25. #define PII pair <int ,int >
  26. #define PLL pair<ll,ll>
  27. #define inf 1000*1000*1000+5
  28. #define v(a,size,value) vi a(size,value)
  29. #define sz(a) a.size()
  30. #define all(a) a.begin(),a.end()
  31. #define tri pair < int , PII >
  32. #define TRI(a,b,c) mp(a,mp(b,c))
  33. #define xx ff
  34. #define yy ss.ff
  35. #define zz ss.ss
  36. #define in(n) n = inp()
  37. #define vii vector < PII >
  38. #define vll vector< PLL >
  39. #define viii vector < tri >
  40. #define vs vector<string>
  41. #define foreach(v,c) for( typeof((c).begin()) v = (c).begin(); v != (c).end(); ++v)
  42. #define fill(a,v) memset(a,v,sizeof a)
  43. #define printall(a) rep(i,sz(a))cout<<a[i]<<endl;
  44. #define DREP(a) sort(all(a)); a.erase(unique(all(a)),a.end());
  45. #define INDEX(arr,ind) (lower_bound(all(arr),ind)-arr.begin())
  46. #define ok if(debug)
  47. #define trace1(x) ok cerr << #x << ": " << x << endl;
  48. #define trace2(x, y) ok cerr << #x << ": " << x << " | " << #y << ": " << y << endl;
  49. #define trace3(x, y, z) ok cerr << #x << ": " << x << " | " << #y << ": " << y << " | " << #z << ": " << z << endl;
  50. #define trace4(a, b, c, d) ok cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " \
  51. << #d << ": " << d << endl;
  52. #define trace5(a, b, c, d, e) ok cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " \
  53. << #d << ": " << d << " | " << #e << ": " << e << endl;
  54. #define trace6(a, b, c, d, e, f) ok cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " \
  55. << #d << ": " << d << " | " << #e << ": " << e << " | " << #f << ": " << f << endl;
  56. ll MOD = int(1e9) + 7;
  57.  
  58.  
  59. #define gc getchar()
  60. inline int inp(){register int n=0,s=1,c=gc;if(c=='-')s=-1;while(c<48)c=gc;while(c>47)n=(n<<3)+(n<<1)+c-'0',c = gc;return n*s;}
  61. #define pc(x) putchar(x) //_unlocked(x);
  62. inline void writeInt (ll n)
  63. { ll N = n, rev, count = 0;rev = N; if (N == 0) { pc('0'); pc('\n'); return ;}
  64. while ((rev % 10) == 0) { count++; rev /= 10;}rev = 0; while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}
  65. while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}while (count--) pc('0'); }
  66. ll powmod(ll num,ll power){if(power==0)return 1%MOD;if(power==1)return num%MOD;
  67. ll t = powmod(num,power/2)%MOD;return power%2?t*t%MOD*num%MOD:t*t%MOD;}
  68. ll pow1(ll num,ll power){if(power==0)return 1;if(power==1)return num; ll t = pow1(num,power/2);return power%2?t*t*num:t*t;}
  69. int check(int);
  70. int binarysearch(int len)//finds last 1 in 11111000
  71. {int lo = 1,hi = len,mid,flag;while(lo<=hi){mid = hi+lo>>1;(flag = check(mid))?lo = mid+1:hi = mid-1;}return mid-1+flag;}
  72. const int N = 2000*100+5;
  73. int debug = 1;
  74. int check(int a){return a;}
  75.  
  76.  
  77. const int base = 1<<18;
  78. ll seg[2*base];
  79. void update(int p,int l,int r,int L,int R,int val)
  80. {
  81. if(l==L && r == R){seg[p] = val;return;}
  82. int mid = (L+R)/2;
  83. if(r < l)return;
  84. if(r <= mid)
  85. update(p*2,l,r,L,mid,val);
  86. else if(l > mid)
  87. update(p*2+1,l,r,mid+1,R,val);
  88. else
  89. {
  90. update(p*2,l,mid,L,mid,val);
  91. update(p*2+1,mid+1,r,mid+1,R,val);
  92. }
  93. seg[p] = seg[2*p] + seg[2*p+1];
  94. }
  95. int query(int p,int l,int r,int L,int R)
  96. {
  97. if(r<l)return 0;
  98. if(l==L && r == R)return seg[p];
  99. int mid = (L+R)/2;
  100. if(r <= mid)
  101. {
  102. return query(p*2,l,r,L,mid);
  103. }
  104. else if(mid < l)
  105. {
  106. return query(p*2+1,l,r,mid+1,R);
  107. }
  108. return query(p*2,l,mid,L,mid) + query(p*2+1,mid+1,r,mid+1,R);
  109. }
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118. int next[N];
  119. ll a[N];
  120. int main()
  121. {
  122. ios::sync_with_stdio(false);
  123. int i,j,n,t,k;
  124. for(i = 1;i < N;i++)next[i] = i - 1;
  125. cin>>n>>k;
  126. ll minval = 0;
  127. rep(i,n)
  128. {
  129. cin>>a[i+1];
  130. minval = min(minval,a[i+1]);
  131. update(1,i+1,i+1,1,base,a[i+1]);
  132. }
  133. ll ans = 0;
  134. for(i = 1;i <= n - k + 1;i++)
  135. {
  136. int sum = query(1,i,i+k-1,1,base);
  137. int cur = i + k - 1;
  138. while(sum >= 0)
  139. {
  140. if(sum >= a[cur] - minval)
  141. {
  142. ans += a[cur] - minval;
  143. sum -= (a[cur] - minval);
  144. update(1,cur,cur,1,base,minval);
  145. a[cur] = minval;
  146. cur = next[cur];
  147. }
  148. else
  149. {
  150. ans += sum + 1;
  151. a[cur] -= (sum + 1);
  152. sum = -1;
  153. update(1,cur,cur,1,base,minval);
  154. }
  155. }
  156. next[i + k] = cur;
  157. }
  158. cout<<ans<<endl;
  159. for(i = 1; i<=n;i++)
  160. cout<<a[i]<<" ";
  161. cin>>i;
  162.  
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement