Codeforces Round #676 (Div. 2)

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;
}

E

原文地址:https://www.cnblogs.com/2aptx4869/p/13839141.html