Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Bismillahir Rahmanir Rahim
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <cctype>
- #include <cstdlib>
- #include <vector>
- #include <string>
- #include <cstring>
- #include <queue>
- #include <set>
- #include <stack>
- #include <map>
- #include <sstream>
- using namespace std;
- long long tree[1000009],ar[1000009],now[2000009],inf,keep[200009],use;
- void init()
- {
- memset(tree,0,sizeof(tree));
- memset(ar,-inf,sizeof(ar));
- }
- void godown(long long node, long long beg,long long end)
- {
- if(ar[node]==-inf) return;
- long long mid;
- mid=beg+end;
- mid=mid/2;
- tree[node*2]=(mid-beg+1)*ar[node];
- tree[node*2+1]=(end-mid)*ar[node];
- ar[node*2]=ar[node];
- ar[node*2+1]=ar[node];
- ar[node]=-inf;
- return;
- }
- void goup(long long node, long long beg,long long end)
- {
- tree[node]=tree[node*2]+tree[node*2+1];
- }
- void update(long long node,long long beg,long long end,long long i, long long j, long long value)
- {
- if(beg>j || end<i) return ;
- if(beg>=i && end<=j)
- {
- tree[node]=(end-beg+1)*value;
- ar[node]=value;
- return ;
- }
- godown(node,beg,end);
- long long mid;
- mid=beg+end;
- mid=mid/2;
- update(node*2,beg,mid,i,j,value);
- update(node*2+1,mid+1,end,i,j,value);
- goup(node,beg,end);
- }
- long long query(long long node,long long beg,long long end,long long i,long long j)
- {
- if(beg>j || end<i) return 0;
- if(beg>=i && end<=j)
- {
- return tree[node];
- }
- godown(node,beg,end);
- long long mid;
- mid=beg+end;
- mid=mid/2;
- long long sum=0;
- sum=sum+query(node*2,beg,mid,i,j);
- sum=sum+query(node*2+1,mid+1,end,i,j);
- return sum;
- }
- long long check(long long low,long long high,long long n,long long beg,long long end,long long tar)
- {
- long long temp;
- if(low==high) return low;
- if(low==high-1)
- {
- temp=query(1,1,n,beg,high);
- use=temp;
- temp=temp+(end-(high+1)+1)*tar;
- if(temp<0)
- return high;
- return low;
- }
- long long mid;
- mid=low+high;
- mid=mid/2;
- temp=query(1,1,n,beg,mid);
- temp=temp+(end-(mid+1)+1)*tar;
- if(temp<0) return check(mid,high,n,beg,end,tar);
- return check(low,mid,n,beg,end,tar);
- }
- int main()
- {
- long long a,s,d,f,g,h,j,k,l,low;
- for(a=1;a<=50;a++) inf=inf*2;
- low=inf;
- cin>>a>>s;
- init();
- for(d=1;d<=a;d++)
- {
- cin>>keep[d];
- low=min(low,keep[d]);
- update(1,1,a,d,d,keep[d]);
- }
- if(s==1)
- {
- for(d=1;d<=a;d++)
- {
- if(keep[d]>=0) now[d]=-1;
- else now[d]=keep[d];
- }
- l=0;
- for(d=1;d<=a;d++)
- {
- l=l+abs(now[d]-keep[d]);
- }
- cout<<l<<endl;
- for(d=1;d<=a;d++)
- {
- cout<<now[d];
- if(d==a) cout<<endl;
- else cout<<" ";
- }
- return 0;
- }
- long long q,last;
- last=-1;
- for(d=1;d<=a-s+1;d++)
- {
- f=query(1,1,a,d,d+s-1);
- if(f<0) continue;
- if(last<d) g=check(d,d+s-1,a,d,d+s-1,low);
- else g=check(last,d+s-1,a,d,d+s-1,low);
- last=d+s-1;
- q=query(1,1,a,d,g);
- q=q+low*((d+s-1)-(g+1)+1);
- if(q<0)
- {
- update(1,1,a,g+2,d+s-1,low);
- k=(d+s-1-(g+2)+1)*low;
- j=query(1,1,a,d,g);
- l=-1-k-j;
- update(1,1,a,g+1,g+1,l);
- }
- else
- {
- update(1,1,a,g+1,d+s-1,low);
- h=(d+s-1-(g+1)+1)*low;
- j=-1-h;
- update(1,1,a,g,g,j);
- }
- }
- l=0;
- for(d=1;d<=a;d++)
- {
- now[d]=query(1,1,a,d,d);
- l=l+abs(now[d]-keep[d]);
- }
- cout<<l<<endl;
- for(d=1;d<=a;d++)
- {
- int temp;
- temp=now[d];
- printf("%d",temp);
- if(d==a) printf("\n");
- else printf(" ");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement