Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include<queue>
- #include<map>
- #include<set>
- #include<algorithm>
- #include<stack>
- #include<cmath>
- #include<iomanip>
- #include<cstdlib>
- #include<sstream>
- using namespace std;
- #define f(i,a,b) for(i=a;i<b;i++)
- #define rep(i,n) f(i,0,n)
- #define pb push_back
- #define ss second
- #define ff first
- #define vi vector<int>
- #define vl vector<ll>
- #define s(n) scanf("%d",&n)
- #define ll long long
- #define mp make_pair
- #define PII pair <int ,int >
- #define PLL pair<ll,ll>
- #define inf 1000*1000*1000+5
- #define v(a,size,value) vi a(size,value)
- #define sz(a) a.size()
- #define all(a) a.begin(),a.end()
- #define tri pair < int , PII >
- #define TRI(a,b,c) mp(a,mp(b,c))
- #define xx ff
- #define yy ss.ff
- #define zz ss.ss
- #define in(n) n = inp()
- #define vii vector < PII >
- #define vll vector< PLL >
- #define viii vector < tri >
- #define vs vector<string>
- #define foreach(v,c) for( typeof((c).begin()) v = (c).begin(); v != (c).end(); ++v)
- #define fill(a,v) memset(a,v,sizeof a)
- #define printall(a) rep(i,sz(a))cout<<a[i]<<endl;
- #define DREP(a) sort(all(a)); a.erase(unique(all(a)),a.end());
- #define INDEX(arr,ind) (lower_bound(all(arr),ind)-arr.begin())
- #define ok if(debug)
- #define trace1(x) ok cerr << #x << ": " << x << endl;
- #define trace2(x, y) ok cerr << #x << ": " << x << " | " << #y << ": " << y << endl;
- #define trace3(x, y, z) ok cerr << #x << ": " << x << " | " << #y << ": " << y << " | " << #z << ": " << z << endl;
- #define trace4(a, b, c, d) ok cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " \
- << #d << ": " << d << endl;
- #define trace5(a, b, c, d, e) ok cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " \
- << #d << ": " << d << " | " << #e << ": " << e << endl;
- #define trace6(a, b, c, d, e, f) ok cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " \
- << #d << ": " << d << " | " << #e << ": " << e << " | " << #f << ": " << f << endl;
- ll MOD = int(1e9) + 7;
- #define gc getchar()
- 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;}
- #define pc(x) putchar(x) //_unlocked(x);
- inline void writeInt (ll n)
- { ll N = n, rev, count = 0;rev = N; if (N == 0) { pc('0'); pc('\n'); return ;}
- while ((rev % 10) == 0) { count++; rev /= 10;}rev = 0; while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}
- while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}while (count--) pc('0'); }
- ll powmod(ll num,ll power){if(power==0)return 1%MOD;if(power==1)return num%MOD;
- ll t = powmod(num,power/2)%MOD;return power%2?t*t%MOD*num%MOD:t*t%MOD;}
- 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;}
- int check(int);
- int binarysearch(int len)//finds last 1 in 11111000
- {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;}
- const int N = 2000*100+5;
- int debug = 1;
- int check(int a){return a;}
- const int base = 1<<18;
- ll seg[2*base];
- void update(int p,int l,int r,int L,int R,int val)
- {
- if(l==L && r == R){seg[p] = val;return;}
- int mid = (L+R)/2;
- if(r < l)return;
- if(r <= mid)
- update(p*2,l,r,L,mid,val);
- else if(l > mid)
- update(p*2+1,l,r,mid+1,R,val);
- else
- {
- update(p*2,l,mid,L,mid,val);
- update(p*2+1,mid+1,r,mid+1,R,val);
- }
- seg[p] = seg[2*p] + seg[2*p+1];
- }
- int query(int p,int l,int r,int L,int R)
- {
- if(r<l)return 0;
- if(l==L && r == R)return seg[p];
- int mid = (L+R)/2;
- if(r <= mid)
- {
- return query(p*2,l,r,L,mid);
- }
- else if(mid < l)
- {
- return query(p*2+1,l,r,mid+1,R);
- }
- return query(p*2,l,mid,L,mid) + query(p*2+1,mid+1,r,mid+1,R);
- }
- int next[N];
- ll a[N];
- int main()
- {
- ios::sync_with_stdio(false);
- int i,j,n,t,k;
- for(i = 1;i < N;i++)next[i] = i - 1;
- cin>>n>>k;
- ll minval = 0;
- rep(i,n)
- {
- cin>>a[i+1];
- minval = min(minval,a[i+1]);
- update(1,i+1,i+1,1,base,a[i+1]);
- }
- ll ans = 0;
- for(i = 1;i <= n - k + 1;i++)
- {
- int sum = query(1,i,i+k-1,1,base);
- int cur = i + k - 1;
- while(sum >= 0)
- {
- if(sum >= a[cur] - minval)
- {
- ans += a[cur] - minval;
- sum -= (a[cur] - minval);
- update(1,cur,cur,1,base,minval);
- a[cur] = minval;
- cur = next[cur];
- }
- else
- {
- ans += sum + 1;
- a[cur] -= (sum + 1);
- sum = -1;
- update(1,cur,cur,1,base,minval);
- }
- }
- next[i + k] = cur;
- }
- cout<<ans<<endl;
- for(i = 1; i<=n;i++)
- cout<<a[i]<<" ";
- cin>>i;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement