贪心
如果有0先变成非0
如果负数的个数 应该变为偶数
之后就是每次将绝对值最小的值加K
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
typedef long long ll;int N,K,X;
ll A[MAXN];
int tag[MAXN];
struct Node{ll x; int id;Node(ll a=0, int b=0):x(a),id(b){}bool operator <(const Node &T) const {return x > T.x;}
};
ll Abs(ll x) {if(x < 0) x *= -1;return x;
}
void doo(int id,ll num) {if(A[id] > 0) A[id] += num;else A[id] -= num;
}
priority_queue<Node> Q;
int main(){while(~scanf("%d %d %d",&N,&K,&X)) {memset(tag,0,sizeof(tag));while(!Q.empty()) Q.pop();// int c1 = 0; int c2 = 0; int c3 = 0; // pos zero negfor(int i = 1; i <= N; ++i) {scanf("%lld",&A[i]);Q.push(Node(Abs(A[i]), i));}for(int i = 1; i <= N; ++i) {if(A[i] < 0) c3 ++; }while(K) {ll x = Q.top().x; int id = Q.top().id;Q.pop();if(x == 0) {if(~c3&1) {A[id] = -X;c3 ++;}else {A[id] = X; }}else if(~c3&1){ll tt = (x+X)/X; if(tt > K) {doo(id, -1ll*K*X);break;}else {doo(id,-1ll*tt*X); K -= tt; K++;}c3 ++;}else {doo(id,X);}
// printf("%d %lld\n",id,A[id]);Q.push(Node(Abs(A[id]),id)); K--;}for(int i = 1; i <= N; ++i) printf("%lld ",A[i]); printf("\n");}return 0;
}