给你一个 n , k n,k n,k和一个 a a a序列,你可以进行操作,计算出 a a a中的最大值 d d d,然后 a i = d − a i a_i=d-a_i ai=d−ai,进行 k k k次这样的操作,求出最后的 a a a序列。
我们列出操作后的序列:
我们可以发现这个序列是交替的,每一次的最大值都是 d d d,第一次操作后肯定有肯定存在一个 b i = 0 b_i=0 bi=0,这里的 d d d指的是 b b b序列中的最大值,不是 a a a序列中的,然后每一次的最大值都是 d − ( b i = 0 ) = d d-(b_i=0)=d d−(bi=0)=d,我们计算出这两个序列,然后判断 k k k的奇偶性就可以得出最终的序列了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T>
inline void read(T &ret) {
char c;
int sgn;
if (c = getchar(), c == EOF) return ;
while (c != '-' && (c < '0' || c > '9')) c = getchar();
sgn = (c == '-') ? -1:1;
ret = (c == '-') ? 0:(c - '0');
while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return ;
}
inline void outi(int x) {if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
const int maxn = 2e5 + 10;
ll a[maxn] = {0}, b[maxn];
int main() {
int t;read(t); while (t--) {
ll n, k; read(n), read(k);
ll Max = -1e9;
for (int i = 0; i < n; i++) {
read(a[i]);
Max = max(a[i], Max);
}
ll Max2 = -1e18;
for (int i = 0; i < n; i++) a[i] = Max - a[i], Max2 = max(a[i], Max2);
for (int i = 0; i < n; i++) b[i] = Max2 - a[i];
if (k & 1) for (int i = 0; i < n; i++) printf("%lld ", a[i]);
else for (int i = 0; i < n; i++) printf("%lld ", b[i]);
printf("\n");
}
return 0;
}
/*
1
5 20
5 -1 4 2 0
*/