Recently Maxim has found an array of n integers, needed by no one. He immediately come up with idea of changing it: he invented positive integer x and decided to add or subtract it from arbitrary array elements. Formally, by applying single operation Maxim chooses integer i (1 ≤ i ≤ n) and replaces the i-th element of array ai either with ai + x or with ai - x. Please note that the operation may be applied more than once to the same position.
Maxim is a curious minimalis, thus he wants to know what is the minimum value that the product of all array elements (i.e. ) can reach, if Maxim would apply no more than k operations to it. Please help him in that.
Input
The first line of the input contains three integers n, k and x (1 ≤ n, k ≤ 200 000, 1 ≤ x ≤ 109) — the number of elements in the array, the maximum number of operations and the number invented by Maxim, respectively.
The second line contains n integers a1, a2, ..., an () — the elements of the array found by Maxim.
Output
Print n integers b1, b2, ..., bn in the only line — the array elements after applying no more than k operations to the array. In particular, should stay true for every 1 ≤ i ≤ n, but the product of all array elements should be minimum possible.
If there are multiple answers, print any of them.
Examples
Input
5 3 15 4 3 5 2
Output
5 4 3 5 -1
Input
5 3 15 4 3 5 5
Output
5 4 0 5 5
Input
5 3 15 4 4 5 5
Output
5 1 4 5 5
Input
3 2 75 4 2
Output
5 11 -5 题意:一个序列长为n,有k个x让你去给序列任意一个数加||减x,然后要求序列各项乘积最大,输出变化后的序列
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+9; struct num { ll abs,val,idx; num(ll val,ll abs,ll idx):val(val),abs(abs),idx(idx) {} bool operator < (const num& rhs)const { return abs>rhs.abs; } }; ll a[N],n,k,x,zero,neg; int main() { //freopen("f.txt","r",stdin); priority_queue<num>q; scanf("%I64d%I64d%I64d",&n,&k,&x); zero=neg=0; for(int i=1; i<=n; i++) { scanf("%I64d",&a[i]); if(a[i]==0)zero++; if(a[i]<0)neg++; q.push(num(a[i],abs(a[i]),i)); } if(zero>k) { for(int i=1; i<=n; i++)printf("%I64d ",a[i]); return 0; } if(neg%2==0) { if(zero) { neg++; zero--,k--; num t=q.top(); q.pop(); a[t.idx]-=x; t.val-=x; t.abs+=x; q.push(t); } } while(zero--) { k--; num t=q.top(); q.pop(); a[t.idx]+=x; t.val+=x; t.abs+=x; q.push(t); } if(neg%2==0) { num t=q.top(); q.pop(); if(t.val<0) { while(t.val<=0&&k)t.val+=x,k--; } else while(t.val>=0&&k)t.val-=x,k--; a[t.idx]=t.val; t.abs=abs(t.val); q.push(t); } while(k--) { num t=q.top(); q.pop(); if(t.val<0)a[t.idx]-=x; else a[t.idx]+=x; t.abs+=x; q.push(t); } for(int i=1; i<=n; i++)printf("%I64d ",a[i]); return 0; }
原文地址:https://www.cnblogs.com/geraldg/p/11247812.html