//乘积为负时 使乘积最小即绝对值最大
//c为剩下的积 |a|<|b| 假如修改b y1=-|a|*(x*m+|b|)*c 如果修改a y2=-(|a|+x)*(|b|+x*(m-1))*c
//-(y2-y1)= (|a|+x)·(|b|+x·m)-|a|·(|b|+x·(m+1))=|b|+x·m-|a|>0
// y2<y1 修改绝对值小的优先
//非负时 为了使之变为负数,优先对绝对值小的进行操作 正数- 负数+
</pre><p></p><p></p><pre code_snippet_id="1915403" snippet_file_name="blog_20161007_1_674333" name="code" class="cpp">#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
const int M=2e5+20;
typedef long long ll;
ll n,k,x;
struct node{
ll num;
int id;
bool operator <(const node& t)const{
return abs(num)>abs(t.num);
//乘积为负时 使乘积最小即绝对值最大
//c为剩下的积 |a|<|b| 假如修改b y1=-|a|*(x*m+|b|)*c 如果修改a y2=-(|a|+x)*(|b|+x*(k-1))*c
//-(y2-y1)= (|a|+x)·(|b|+x·m)-|a|·(|b|+x·(m+1))=|b|+x·m-|a|>0
// y2<y1 修改绝对值小的优先
//非负时 为了使之变为负数,优先对绝对值小的进行操作 正数- 负数+
}
};
ll a[M];
int main()
{
priority_queue <node> q;
cin>>n>>k>>x;
int neg=1;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]<0)
{
neg=-neg;
}
q.push((node){a[i],i});
}
while(k--)
{
node t=q.top();
q.pop();
if(a[t.id]<0)
{
if(neg==-1)//当前乘积为负数
{
a[t.id]-=x; //绝对值小的往绝对值增大的方向走
}
else
{
a[t.id]+=x;//使之变号
}
if(a[t.id]>=0)
neg=-neg;
}
else
{
if(neg==-1)
{
a[t.id]+=x; //当前乘积为负数,绝对值小的往绝对值增大的方向走
}
else
{
a[t.id]-=x;
}
if(a[t.id]<0)
neg=-neg;
}
q.push((node){a[t.id],t.id});
}
for(int i=0;i<n;i++)
{
printf("%I64d%c",a[i],i==n-1?'\n':' ');
}
return 0;
}