恶心,艹

Codeforces Round 1047 (Div. 3) 题解

A

人类智慧题,一直 \(\times 2\) 即可。

B

不难发现,只要两个相邻的数字一样即可达到要求,于是考虑直接互补相加,即按照排完序后反转相加的做法得到每个数字应该的目标值即可。

C

根据极限法想到除的 \(k\) 越大,最后得到的偶数和就会越接近 \(a \times b\),所以会越大,考虑两个偶数的情况直接就是 \(/ 2 + 2\),如果只有 \(a\) 是奇数考虑 \(b\) 是否为奇偶得到的积,如果是就无解,否则就是除以那个较大的数字。

最后如果 \(b\) 为奇数但是 \(a\) 为偶数不难发现一定非法。

如果直接两个奇数就是 \(a\times b + 1\)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long

ll a, b;

void solve () {
    cin >> a >> b;
    if (b&1 && !(a&1)) { cout << "-1\n"; return; }
    if (b&1) {
        cout << 1 + a*b << "\n";
        return;
    } else {
        if (!(a&1)) {
            ll res = b/2;
            cout << a*res + 2 << "\n";
            return;
        } else {
            ll res = b/2;
            if (res&1) { cout << "-1\n"; return; }
            cout << a*res + 2 << "\n";
            return;
        }
    }
}

int main () {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int _ = 1; cin >> _;
    while (_--) solve();
    return 0;
}

D

比较唐的模拟,可以水过去。

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;

int t, n, b[N], d[N];
queue<int> q[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> t;
    while (t--) {
        cin >> n;
        for (int i = 1; i <= n; i++) {
            d[i] = 0;
        }
        for (int i = 1; i <= n; i++) {
            cin >> b[i];
            d[b[i]]++;
        }
        bool valid = true;
        for (int k = 1; k <= n; k++) {
            if (d[k] % k != 0) {
                valid = false;
                break;
            }
        }
        if (!valid) {
            cout << "-1\n";
            continue;
        }
        int cur = 1;
        vector<int> used;
        for (int k = 1; k <= n; k++) {
            if (d[k] > 0) {
                used.push_back(k);
                int cnt = d[k] / k;
                for (int j = 0; j < cnt; j++) {
                    q[k].push(cur++);
                }
            }
        }
        for (int i = 1; i <= n; i++) {
            int k = b[i];
            int x = q[k].front();
            q[k].pop();
            cout << x << " ";
            q[k].push(x);
        }
        cout << "\n";
        for (int k : used) {
            while (!q[k].empty()) {
                q[k].pop();
            }
        }
    }
    return 0;
}