A
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n >> m; k = 0;
rep (i, 0, 30)
if ((n >> i & 1) && (m >> i & 1)) k += 1 << i;
cout << (n ^ k) + (m ^ k) << '
';
}
return 0;
}
B
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n;
rep (i, 1, n) {
cin >> s[i] + 1;
}
vector<PII> ans;
if (s[1][2] == s[2][1]) {
if (s[n][n - 1] == s[1][2]) ans.pb({n, n - 1});
if (s[n - 1][n] == s[1][2]) ans.pb({n - 1, n});
} else if (s[n][n - 1] == s[n - 1][n]) {
if (s[n][n - 1] == s[1][2]) ans.pb({1, 2});
if (s[n - 1][n] == s[2][1]) ans.pb({2, 1});
} else {
if (s[1][2] != '0') ans.pb({1, 2});
if (s[2][1] != '0') ans.pb({2, 1});
if (s[n][n - 1] == '0') ans.pb({n, n - 1});
if (s[n - 1][n] == '0') ans.pb({n - 1, n});
}
cout << ans.size() << '
';
for (auto i : ans) cout << i.fi << ' ' << i.se << '
';
}
return 0;
}
C
操作是对称的
想象最后一步 ABCDE "R 2"("L n - 1", 操作对称) ABCDEDCB, 正好多了个 A, 随我我们希望 C == A, 这样 就可以 "R n - 1", 形成回文
因为给定串 ABCDE, 不能保证 A == C, 我们就要认为去 改变串的左边字符, 答案也就出来了
3次就够了, 我傻了, 直接 "L 2", "R 2", "R 2*len - 1" 就行了, 第一步已经复制了开头了
int main() {
IOS; cin >> s + 1;
int len = strlen(s + 1);
cout << 4 << '
';
cout << "L " << len - 1 << '
';
cout << "L " << 2 << '
';
cout << "R " << 2 << '
';
cout << "R " << 4 * len - 5;
return 0;
}
D
我们先扩展坐标, 每个六边形的宽度为 2 个单位, 则扩展之后的坐标 (x, y) -> (x, y * 2 - x)
然后找等效移动的最小值, 比如 c1 等效于 c6 + c2, 故 c1 = min(c1, c6 + c2)
使得等效移动花费最小, 然后贪心移动
int main() {
IOS;
for (cin >> _; _; --_) {
ll x, y, ans = 0; cin >> x >> y; y = (y << 1) - x;
rep (i, 1, 6) cin >> c[i];
umin(c[1], c[6] + c[2]); umin(c[3], c[2] + c[4]); umin(c[4], c[3] + c[5]);
umin(c[6], c[1] + c[5]); umin(c[2], c[1] + c[3]); umin(c[5], c[6] + c[4]);
if (abs(x) >= abs(y))
if (x >= 0) ans += (y > 0 ? c[1] : c[6]) * abs(y) + (x - abs(y) >> 1) * (c[1] + c[6]);
else ans += (y > 0 ? c[3] : c[4]) * abs(y) + (-x - abs(y) >> 1) * (c[3] + c[4]);
else
if (x >= 0) ans += (y > 0 ? c[1] : c[6]) * x + (abs(y) - x >> 1) * (y > 0 ? c[2] : c[5]);
else ans += (y > 0 ? c[3] : c[4]) * (-x) + (abs(y) + x >> 1) * (y > 0 ? c[2] : c[5]);
cout << ans << '
';
}
return 0;
}