codeforces B. Omkar and Infinity Clock

codeforces B. Omkar and Infinity Clock_第1张图片

题目

题意:

给你一个 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=dai,进行 k k k次这样的操作,求出最后的 a a a序列。

思路:

我们列出操作后的序列:

  • 第一次: b 1 , b 2 , b 3 , . . . . b n ( m a x = d ) b_1,b_2,b_3,....b_n(max = d) b1,b2,b3,....bn(max=d)
  • 第二次: d − b 1 , d − b 2 , d − b 3 , . . . . , d − b n ( m a x = d ) d-b_1,d-b_2,d-b_3,....,d-b_n(max=d) db1,db2,db3,....,dbn(max=d)
  • 第三次: d − ( d − b 1 ) = b 1 , d − ( d − b 2 ) = b 2 , . . . . . , b n ( m a x = d ) d-(d-b_1)=b_1,d-(d-b_2)=b2,.....,b_n(max=d) d(db1)=b1,d(db2)=b2,.....,bn(max=d)

我们可以发现这个序列是交替的,每一次的最大值都是 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
*/


你可能感兴趣的:(codeforces)