恶心,艹
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;
}
浙公网安备 33010602011771号