令 b [ i ] = a [ i ] + a [ i + 1 ] b[i]=a[i]+a[i+1] b[i]=a[i]+a[i+1];操作转化为对 b [ 1 ] b[1] b[1]或 b [ n − 1 ] b[n-1] b[n−1]加一个数,或对 b b b中相邻两个数同加一个数;最终要使所有 b [ i ] b[i] b[i]满足 L ≤ b [ i ] ≤ R L \leq b[i] \leq R L≤b[i]≤R.
考虑贪心, b [ i ] < L b[i]<L b[i]<L时尽可能增大变成 L L L, L ≤ b [ i ] ≤ R L \leq b[i] \leq R L≤b[i]≤R尽可能不变大.
处理到 i i i时,前面的都已经合法;如果 b [ i + 1 ] < L b[i+1]<L b[i+1]<L,则同加 b [ i ] 和 b [ i + 1 ] b[i]和b[i+1] b[i]和b[i+1];然后,如果 b [ i − 1 ] < R b[i-1]<R b[i−1]<R,则同加 b [ i ] 和 b [ i − 1 ] b[i]和b[i-1] b[i]和b[i−1];最后,如果 b [ i + 1 ] < R b[i+1]<R b[i+1]<R,则同加 b [ i ] 和 b [ i + 1 ] b[i]和b[i+1] b[i]和b[i+1].对于 b [ 1 ] b[1] b[1]和 b [ n − 1 ] b[n-1] b[n−1],需要特殊处理.
#include<bits/stdc++.h>
#define mid ((l+r)>>1)
#define inf 1000000007
#define N 500005
using namespace std;
long long read()
{
long long x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x*f;
}
int n,m,L,R,a[N],b[N];
long long ans;
void work()
{
for(int i=1,k;i<n;i++)
{
if(b[i]>R)
{
ans=-1;
return;
}
if(b[i]>=L)continue;
if(i==1)
{
if(b[i+1]<L)
{
k=min(L-b[i],L-b[i+1]);
b[i]+=k;b[i+1]+=k;a[i+1]+=k;
ans+=k;
}
if(b[i]>=L)continue;
ans+=L-b[i];a[i]+=L-b[i];
b[i]=L;
continue;
}
if(i==n-1)
{
ans+=L-b[i];a[i+1]+=L-b[i];
b[i]=L;
continue;
}
if(b[i+1]<L)
{
k=min(L-b[i],L-b[i+1]);
b[i]+=k;b[i+1]+=k;a[i+1]+=k;
ans+=k;
if(b[i]>=L)continue;
}
if(b[i-1]<R)
{
k=min(L-b[i],R-b[i-1]);
b[i]+=k;b[i-1]+=k;a[i]+=k;
ans+=k;
if(b[i]>=L)continue;
}
if(b[i+1]<R)
{
k=min(L-b[i],R-b[i+1]);
b[i]+=k;b[i+1]+=k;a[i+1]+=k;
ans+=k;
if(b[i]>=L)continue;
}
if(b[i]<L)
{
ans=-1;return;
}
}
}
void print()
{
printf("%lld\n",ans);
if(ans==-1)return;
for(int i=1;i<=n;i++)
{
printf("%d ",a[i]);
}printf("\n");
}
int main()
{
n=read(),L=read(),R=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
b[i-1]=a[i]+a[i-1];
}
work();
print();
return 0;
}