codeforces 721D D. Maxim and Array (STL||优先队列)

来源:互联网 发布:如何测试udp端口通不通 编辑:程序博客网 时间:2024/05/04 10:34


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 integerx and decided to add or subtract it from arbitrary array elements. Formally, by applying single operation Maxim chooses integeri (1 ≤ i ≤ n) and replaces thei-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 thank operations to it. Please help him in that.

Input

The first line of the input contains three integers n, k andx (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 thank operations to the array. In particular, should stay true for every 1 ≤ i ≤ n, but the product of all array elements should beminimum 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次操作,每次操作可以将第i个数+x或者-x,输出k次操作后这n个数乘积最小时的数列


解题:每次处理绝对值最小的数,如果当前乘积是负数,该数尽量远离0。如果当前成绩是正数,该数靠近0。。

我是用优先队列来处理,重载运算符


#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int N = 2e5+100;typedef long long ll;struct node{ll x;ll index;}a[N];bool operator<(node a , node b){      return abs(a.x)>abs(b.x);    }  priority_queue<node>que;int main(){ios::sync_with_stdio(false);  ll n,k,x,i,j;int flag=1;node temp;cin>>n>>k>>x;for(i=1;i<=n;i++) {cin>>a[i].x;a[i].index=i;que.push(a[i]);if(a[i].x<0) flag=-flag; }while(k--) {temp=que.top();que.pop();if(temp.x<0) {if(flag==-1) a[temp.index].x-=x;else a[temp.index].x +=x;if(a[temp.index].x>=0) flag=-flag;}else {if(flag==-1) a[temp.index].x+=x;else a[temp.index].x-=x;if(a[temp.index].x<0) flag=-flag;}que.push(a[temp.index]);}for(i=1;i<=n;i++) cout<<a[i].x<<" ";cout<<endl;return 0;}




0 0
原创粉丝点击