比赛链接:Here

1562A. The Miracle and the Sleeper

题意:

  • 给出 Codeforces Round #741 (Div. 2) - 图1 求出最大化的 Codeforces Round #741 (Div. 2) - 图2Codeforces Round #741 (Div. 2) - 图3

思路:
很容易就看出 Codeforces Round #741 (Div. 2) - 图4Codeforces Round #741 (Div. 2) - 图5%3D%5Cleft%5Clfloor%5Cfrac%7Br-1%7D%7B2%7D%5Cright%5Crfloor#card=math&code=r%5Cbmod%20%5Cleft%28%5Cleft%5Clfloor%5Cfrac%7Br%7D%7B2%7D%5Cright%5Crfloor%2B1%5Cright%29%3D%5Cleft%5Clfloor%5Cfrac%7Br-1%7D%7B2%7D%5Cright%5Crfloor) 就是最大可能的答案,

但如果 Codeforces Round #741 (Div. 2) - 图6 的话最大值应该是 Codeforces Round #741 (Div. 2) - 图7

时间复杂度:Codeforces Round #741 (Div. 2) - 图8#card=math&code=%5Cmathcal%7BO%7D%281%29)

  1. void solve() {
  2. ll l, r;
  3. cin >> l >> r;
  4. if (r / 2 >= l) cout << ((r - 1) / 2) << "\n";
  5. else cout << r % l << "\n";
  6. }

1562B. Scenes From a Memory

题意:

  • 给出一个字符串 Codeforces Round #741 (Div. 2) - 图9#card=math&code=s%5C%3B%20%28%7Cs%7C%5Cle50%29) 请问可以从字符串中删除的最大位数是多少使得字符串数字变为非素数? 如:Codeforces Round #741 (Div. 2) - 图10 删除第二位的 Codeforces Round #741 (Div. 2) - 图11 变为 Codeforces Round #741 (Div. 2) - 图12

思路:
说实话赛时想复杂了,因为在 Codeforces Round #741 (Div. 2) - 图13 的情况下其实素数并不多(实际也只要考虑 Codeforces Round #741 (Div. 2) - 图14 位数的情况就ok),即使直接去模拟情况都可以。

但利用素数筛就能很快AC了

  1. bool prime[110];
  2. int n;
  3. string s;
  4. void solve() {
  5. for (int i = 0; i < n; i++) {
  6. if (s[i] == '1' || s[i] == '4' || s[i] == '6' || s[i] == '8' || s[i] == '9') {
  7. cout << 1 << endl;
  8. cout << s[i] << endl;
  9. return;
  10. }
  11. }
  12. for (int i = 0; i < n; i++) {
  13. for (int j = i + 1; j < n; j++) {
  14. if (!prime[(s[i] - '0') * 10 + (s[j] - '0')]) {
  15. cout << 2 << endl;
  16. cout << s[i] << s[j] << endl;
  17. return;
  18. }
  19. }
  20. }
  21. }
  22. int main() {
  23. cin.tie(nullptr)->sync_with_stdio(false);
  24. for (int i = 2; i < 100; ++i) {
  25. prime[i] = 1;
  26. for (int j = 2; j * j <= i; ++j)
  27. if (i % j == 0)prime[i] = 0;
  28. }
  29. int _; for (cin >> _; _--;) {
  30. cin >> n >> s;
  31. solve();
  32. }
  33. }

1562C. Rings

题意:

  • 给出一个 Codeforces Round #741 (Div. 2) - 图15 字符串,以及函数 Codeforces Round #741 (Div. 2) - 图16%3A#card=math&code=f%28s%29%3A) 将 $01 $ 转为十进制整数,请找出两对下标 Codeforces Round #741 (Div. 2) - 图17%2C(l2%2Cr_2)#card=math&code=%28l_1%2Cr_1%29%2C%28l_2%2Cr_2%29) 使得 ![](https://g.yuque.com/gr/latex?f(s%7B(l1%2Cr_1)%7D)%20%3D%20k%5Ctimes%20f(s%7B(l2%2Cr_2)%7D)#card=math&code=f%28s%7B%28l1%2Cr_1%29%7D%29%20%3D%20k%5Ctimes%20f%28s%7B%28l_2%2Cr_2%29%7D%29) 成立

思路:
麻了,前面应是没想到怎么去构造一个这样的等式,手写 Codeforces Round #741 (Div. 2) - 图18Codeforces Round #741 (Div. 2) - 图19 等特殊情况的时候想到我只要定位到第一个 Codeforces Round #741 (Div. 2) - 图20#card=math&code=0%28pos%29) 的位置就可以了,然后以 Codeforces Round #741 (Div. 2) - 图21 为界划分为两部分就肯定能构造 Codeforces Round #741 (Div. 2) - 图22%7D)%20%3D%20k%5Ctimes%20f(s%7B(l_2%2Cr_2)%7D)#card=math&code=f%28s%7B%28l1%2Cr_1%29%7D%29%20%3D%20k%5Ctimes%20f%28s%7B%28l_2%2Cr_2%29%7D%29)

  1. const int N = 1e5 + 10;
  2. int main() {
  3. // ! 记得注释掉,麻了,输入流乱了导致后面debug半天没找到问题
  4. // cin.tie(nullptr)->sync_with_stdio(false);
  5. int _; for (cin >> _; _--;) {
  6. ll n; cin >> n;
  7. char s[N];
  8. scanf("%s", s + 1);
  9. ll cnt0 = 0, cnt1 = 0;
  10. for (int i = 1; i <= n; ++i) if (s[i] == '1') cnt1 += 1;
  11. if (cnt1 == n) {
  12. cout << "1 " << n - 1 << " 2 " << n << "\n";
  13. continue;
  14. }
  15. int p = 0;
  16. for (int i = 1; i <= n; ++i)
  17. if (s[i] == '0') {
  18. p = i;
  19. break;
  20. }
  21. if (p - 1 < (n / 2)) cout << p << " " << n << " " << p + 1 << " " << n << "\n";
  22. else cout << 1 << " " << p << " " << 1 << " " << p - 1 << "\n";
  23. }
  24. }

1562D. Two Hundred Twenty One (Easy and Hard)

题意:

题意待补

思路:

Codeforces Round #741 (Div. 2) - 图23 号转为 Codeforces Round #741 (Div. 2) - 图24 再维护前缀和,可以快速判断奇偶(D1)

核心在于利用前缀和进行二分(D2)

不过有人用 map + set 也过了就很神奇(TQL

  1. // D1
  2. const int N = 3e5 + 10;
  3. int a[N], sum[N];
  4. int main() {
  5. cin.tie(nullptr)->sync_with_stdio(false);
  6. int _; for (cin >> _; _--;) {
  7. int n, q;
  8. string s;
  9. cin >> n >> q >> s;
  10. int id = 0;
  11. for (int i = 0; i < s.size(); ++i) {
  12. if (i & 1) {
  13. if (s[i] == '+') a[++id] = -1;
  14. else a[++id] = 1;
  15. } else {
  16. if (s[i] == '-') a[++id] = -1;
  17. else a[++id] = 1;
  18. }
  19. sum[id] = sum[id - 1] + a[id];
  20. }
  21. while (q--) {
  22. int l, r; cin >> l >> r;
  23. if (abs(sum[r] - sum[l - 1]) == 0) cout << "0\n";
  24. else if (abs(sum[r] - sum[l - 1]) & 1) cout << "1\n";
  25. else cout << "2\n";
  26. }
  27. }
  28. }
  1. // D2
  2. int main() {
  3. cin.tie(nullptr)->sync_with_stdio(false);
  4. int _; for (cin >> _; _--;) {
  5. int n, q;
  6. cin >> n >> q;
  7. string _s;
  8. cin >> _s;
  9. vector<int> which(n);
  10. for (int i = 0; i < n; i++) {
  11. which[i] = (_s[i] == '-') != (i & 1);
  12. }
  13. vector<int> psum(n + 1, 0);
  14. for (int i = 0; i < n; i++) {
  15. psum[i + 1] = psum[i] + (which[i] ? -1 : 1);
  16. }
  17. while (q--) {
  18. int l, r;
  19. cin >> l >> r; l--; r--;
  20. if (psum[r + 1] == psum[l]) cout << "0\n\n";
  21. else {
  22. if ((r + 1 - l) & 1) cout << "1\n";
  23. else {
  24. cout << "2\n";
  25. cout << (r + 1) << ' ';
  26. r--;
  27. }
  28. int d = min(psum[l], psum[r + 1]) + abs(psum[l] - psum[r + 1]) / 2;
  29. // d -> d+1
  30. int s = l;
  31. int e = r + 1;
  32. while (s + 1 < e) {
  33. int m = (s + e) / 2;
  34. if ((psum[m] <= d) == (psum[s] <= d)) s = m;
  35. else e = m;
  36. }
  37. cout << s + 1 << "\n";
  38. }
  39. }
  40. }
  41. }