Maxim and Array

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

时间: 2024-11-03 00:21:38

Maxim and Array的相关文章

Codeforces Round #374 (Div. 2) D. Maxim and Array

题解: 模拟题 虽然是个大模拟题,但是很考验思维的活跃度. 刚开始做的时候知道怎么做.但是自己的想法情况很多.分类枚举总是把自己混淆 这题教会我的是,要仔细思考分类的方式 这个题.根据枚举负数的个数奇偶来判断 为奇数:那么绝对值最小的数,如果是正,+x,是负,-x; 为偶数:那么使得绝对值最小的数.改变符号,如果正-x,负+x. 代码: #include<bits/stdc++.h> #define maxn 200010 #define mod 1000000007 #define ll l

CodeForces 721D Maxim and Array

贪心,优先队列. 先看一下输入的数组乘积是正的还是负的. ①如果是负的,也就是接下来的操作肯定是让正的加大,负的减小.每次寻找一个绝对值最小的数操作就可以了. ②如果是正的,也是考虑绝对值,先操作绝对值最小的那个数,直到那个数字的符号发生变化就停止操作,接下来就是第①步. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #incl

Maxim and Array CodeForces - 721D (贪心)

大意: 给定序列, 每次操作选择一个数+x或-x, 最多k次操作, 求操作后所有元素积的最小值 贪心先选出绝对值最小的调整为负数, 再不断选出绝对值最小的增大它的绝对值 #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map> #include <queue> #inc

Codeforces Round #374 (Div. 2)解题报告

Problem B: Passwords 题意:给出n个字符串密码,在给出一个正确密码,输密码必须先输入简单的密码,连续输错k次密码会罚时5秒,输一次密码耗时1秒,求可能的最短和最长的耗时.(注意:给出的n个密码可能包含多个正确密码) 思路:略 code: #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <c

Codeforces Round #374 (div.2)遗憾题合集

C.Journey 读错题目了...不是无向图,结果建错图了(喵第4样例是变成无向就会有环的那种图) 并且这题因为要求路径点尽可能多 其实可以规约为限定路径长的拓扑排序,不一定要用最短路做 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm>

CF #374 (Div. 2) D. 贪心,优先队列或set

1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优先队列 #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(

PHP Warning: array_multisort(): Array sizes are inconsistent

array_multisort() 函数返回排序数组.您可以输入一个或多个数组.函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序. 遇到这报错是两个数组对比不一致导致的, 如果是一维数组与二维数组进行排序可以用以下方法解决: 使用这个方法,会比较麻烦些,要将age提取出来存储到一维数组里,然后按照age升序排列.具体代码如下: 复制代码代码如下: $ages = array();foreach ($users as $user) {    $ages[]

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

JavaScript的进阶之路(三)引用类型之Object类型和Array类型

引用类型 Object类型 function a(num){ if(num>3){ a(--num); } console.log(num); } a(5); //如何创建对象的实例 var obj1= new Object(); console.log(obj1); obj1.name="吴琼"; obj1.age=28; console.log(obj1.name+" "+obj1.age); //对象字面量语法 ,有点封装的感觉 var obj2 = {