补题链接:Here

1512A - Spy Detected!

题意:找到唯一不同数的下标

复制数组然后比较 Codeforces Round #713 (Div. 3) Person Editorial - 图1

  1. int main() {
  2. ios_base::sync_with_stdio(false), cin.tie(0);
  3. int _;
  4. for (cin >> _; _--;) {
  5. int n;
  6. cin >> n;
  7. vector<int> v(n);
  8. for (int &e : v) {
  9. cin >> e;
  10. }
  11. vector<int> a = v;
  12. sort(a.begin(), a.end());
  13. for (int i = 0; i < n; i++) {
  14. if (v[i] != a[1]) {
  15. cout << i + 1 << "\n";
  16. }
  17. }
  18. }
  19. return 0;
  20. }

1512B - Almost Rectangle

题意:给定 Codeforces Round #713 (Div. 3) Person Editorial - 图2.* 坐标图,* 仅两个找到对称位置使 4 个 * 构成矩阵

分别考虑 同行、同列、不同行同列

  1. struct node {
  2. int x, y;
  3. };
  4. int main() {
  5. ios_base::sync_with_stdio(false), cin.tie(0);
  6. int _;
  7. for (cin >> _; _--;) {
  8. int n;
  9. cin >> n;
  10. vector<string> a(n);
  11. for (int i = 0; i < n; ++i) cin >> a[i];
  12. vector<node> star;
  13. bool f = false;
  14. for (int i = 0; i < n && !f; ++i)
  15. for (int j = 0; j < n && !f; ++j) {
  16. if (a[i][j] == '*') {
  17. star.push_back({i, j});
  18. }
  19. if (star.size() == 2) f = true;
  20. }
  21. // 同行
  22. if (star[0].x == star[1].x) {
  23. if (star[0].x + 1 < n) {
  24. a[star[0].x + 1][star[0].y] = '*';
  25. a[star[1].x + 1][star[1].y] = '*';
  26. } else {
  27. a[star[0].x - 1][star[0].y] = '*';
  28. a[star[1].x - 1][star[1].y] = '*';
  29. }
  30. } else if (star[0].y == star[1].y) { // 同列
  31. if (star[0].y + 1 < n) {
  32. a[star[0].x][star[0].y + 1] = '*';
  33. a[star[1].x][star[1].y + 1] = '*';
  34. } else {
  35. a[star[0].x][star[0].y - 1] = '*';
  36. a[star[1].x][star[1].y - 1] = '*';
  37. }
  38. } else {
  39. a[star[0].x][star[1].y] = '*';
  40. a[star[1].x][star[0].y] = '*';
  41. }
  42. for (int i = 0; i < n; ++i) {
  43. cout << a[i] << "\n";
  44. }
  45. }
  46. return 0;
  47. }

1512C - A-B Palindrome

题意:是否能把字符串中的 ? 替换为 10 使得字符串为回文串。

注意点:长度为奇数时,如果中点是 ? 则提前处理掉

AC 代码:

  1. string solve() {
  2. int a, b;
  3. string s;
  4. cin >> a >> b >> s;
  5. int n = a + b;
  6. for (int i = 0; i < s.size(); i++)
  7. if (s[i] == '1' && s[n - 1 - i] == '0')
  8. return "-1";
  9. for (int i = 0; i < s.size(); i++)
  10. if (s[i] == '?')
  11. s[i] = s[n - 1 - i];
  12. if (n % 2 && s[n / 2] == '?')
  13. if (a % 2)
  14. s[n / 2] = '0';
  15. else
  16. s[n / 2] = '1';
  17. for (char c : s)
  18. if (c == '0')
  19. a--;
  20. else if (c == '1')
  21. b--;
  22. if (a % 2 || b % 2 || a < 0 || b < 0)
  23. return "-1";
  24. for (int i = 0; i < s.size(); i++)
  25. if (s[i] == '?')
  26. if (a)
  27. s[i] = s[n - 1 - i] = '0', a -= 2;
  28. else
  29. s[i] = s[n - 1 - i] = '1', b -= 2;
  30. return s;
  31. }
  32. int main() {
  33. ios_base::sync_with_stdio(false), cin.tie(0);
  34. int _;
  35. for (cin >> _; _--;) {
  36. cout << solve() << "\n";
  37. }
  38. return 0;
  39. }

1512D - Corrupted Array

Codeforces Round #713 (Div. 3) Person Editorial - 图3 中所有元素的总和是多少? 这是 Codeforces Round #713 (Div. 3) Person Editorial - 图4 中所有元素之和的两倍。
Codeforces Round #713 (Div. 3) Person Editorial - 图5 表示 Codeforces Round #713 (Div. 3) Person Editorial - 图6 的所有元素的总和。 让我们迭代添加哪些数组元素作为元素 Codeforces Round #713 (Div. 3) Person Editorial - 图7 的总和(以 Codeforces Round #713 (Div. 3) Person Editorial - 图8 表示)。 然后,Codeforces Round #713 (Div. 3) Person Editorial - 图9。 剩下的要检查的是元素 Codeforces Round #713 (Div. 3) Person Editorial - 图10 是否存在于数组 Codeforces Round #713 (Div. 3) Person Editorial - 图11

上面的思路可以使用哈希表或二进制搜索树来完成。

  1. using ll = long long;
  2. void solve() {
  3. int n;
  4. cin >> n;
  5. vector<ll> b(n + 2);
  6. for (int i = 0; i < n + 2; i++)
  7. cin >> b[i];
  8. sort(b.begin(), b.end());
  9. ll sum = 0;
  10. for (int i = 0; i <= n; i++)
  11. sum += b[i];
  12. for (int i = 0; i <= n; i++) {
  13. if (sum - b[i] == b.back() || sum - b[i] == b[i]) {
  14. for (int j = 0; j <= n; j++) {
  15. if (j != i)
  16. cout << b[j] << " ";
  17. }
  18. cout << "\n";
  19. return;
  20. }
  21. }
  22. cout << "-1\n";
  23. }