abc 348 D
auto [x, y] = q.front(); // 将 pair<int, int> 映射到 x 和 y 上
dp 优化的 BFS,记忆化搜索
只有当前点到下一个点比存储起来的要到达的点能量多,才往下一个点bfs
abc 347 D
注意一定要用 __builtin_popcountll(), 用 __builtin_popcount() 会 wa
还应该判断清楚a, b 的数量关系,如果没有判断清楚也会 wa
c 中为 1 的位,每次从 a, b 中消耗一个 1,剩余的 a 和 b 应该成对出现
这样 c 中为 1 的位从 a 和 b 已经成对完成剩余的里面挑一个
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll a, b, c;
cin >> a >> b >> c;
vector<int> A(60), B(60);
int C = __builtin_popcountll(c);
int d = (a + b - C) / 2;
if (a + b - C & 1 || a + b < C || abs(a - b) > C) {
cout << "-1\n";
return 0;
}
a -= d, b -= d;
for (int i = 0; i < 60; i ++) {
if (c >> i & 1) {
if (a > 0) {
a --, A[i] = 1;
} else {
b --, B[i] = 1;
}
} else {
if (d) {
d --, A[i] = 1, B[i] = 1;
}
}
}
ll ansa = 0, ansb = 0;
for (int i = 0; i < 60; i ++) {
if (A[i]) ansa |= 1LL << i;
if (B[i]) ansb |= 1LL << i;
}
cout << ansa << ' ' << ansb << endl;
return 0;
}