Codeforces Round 895 (Div. 3)

╰+攻爆jí腚メ 2024-03-04 01:04 212阅读 0赞

https://codeforces.com/contest/1872

B. The Corridor or There and Back Again

如果还有s秒出发开关,那么就会最多走(s - 1) / 2个房间,在所有可以到的房间个数中选择最小的那个则为最大。首先我们可以发现,陷阱之间是独立的,只有我们到达陷阱之后,陷阱才会启动,而且每个陷阱的触发时间决定了我们应该什么时候回到这个位置,所以我们可以算出来每个陷阱最远可以到达哪里,然后再选择最近的那个点,因为不能跑更远。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int t, n, d, s, ans;
  4. int main()
  5. {
  6. cin >> t;
  7. while(t --)
  8. {
  9. ans = 2e5 + 10;
  10. cin >> n;
  11. for(int i = 1; i <= n; i ++)
  12. {
  13. cin >> d >> s;
  14. ans = min(ans, d + (s - 1) / 2);
  15. }
  16. cout << ans << '\n';
  17. }
  18. return 0;
  19. }

C. Non-coprime Split

可以分为奇数和偶数两种情况讨论,应为如果是偶数就一定可以被2整数,如果是奇数就观察是否是素数,如果不是素数则可以使用辗转相减法求gcd(a,b)=gcd(b,a−b)

eg.gcd(12, 3) = gcd(3, 12 - 3)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int t;
  4. void solve()
  5. {
  6. int l, r;
  7. cin >> l >> r;
  8. for(int i = r; i >= l; i --)
  9. {
  10. if(i % 2 == 0 && i > 2)
  11. {
  12. cout << i - 2 << ' ' << 2 << '\n';
  13. return;
  14. }
  15. else if(i % 2 != 0 && i > 3)
  16. {
  17. for(int j = 3; j <= i / j; j ++)
  18. {
  19. if(i % j == 0)
  20. {
  21. cout << j << ' ' << i - j << '\n';
  22. return;
  23. }
  24. }
  25. }
  26. }
  27. cout << -1 << '\n';
  28. return;
  29. }
  30. int main()
  31. {
  32. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  33. cin >> t;
  34. while(t --)
  35. {
  36. solve();
  37. }
  38. return 0;
  39. }

D. Plus Minus Permutation

要求得最大值需要减数最大,被减数最小,对于下方结论3而言,同是x, y的倍数会使两个数相抵消,加之后会被减去。

利用等差数列公式算出每部分的和再相减即可fb12460a4d094eb680782cc2de45ffcc.png

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long gcd(long long a, long long b)
  4. {
  5. return b == 0 ? a : gcd(b, a % b);
  6. }
  7. long long lcm(long long a, long long b)
  8. {
  9. return a * b / gcd(a, b);
  10. }
  11. long long f(long long a, long long b, long long cnt)
  12. {
  13. return (a + b) * cnt / 2;
  14. }
  15. void solve()
  16. {
  17. long long n, x, y;
  18. cin >> n >> x >> y;
  19. long long cnt1 = n / x;
  20. long long cnt2 = n / y;
  21. long long cnt3 = n / lcm(x, y);
  22. cnt1 -= cnt3;
  23. cnt2 -= cnt3;
  24. cout << f(n,n - cnt1 + 1, cnt1) - f(1, cnt2, cnt2) << '\n';
  25. }
  26. int main()
  27. {
  28. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  29. long long t;
  30. cin >> t;
  31. while(t --)
  32. {
  33. solve();
  34. }
  35. return 0;
  36. }

E. Data Structures Fan

使用异或和进行优化

b3addfbfdd82467497eae8825f9f685d.png

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  6. int t;
  7. cin >> t;
  8. while(t --)
  9. {
  10. int n, q, a[100000], su[100000];
  11. char s[100000];
  12. cin >> n;
  13. for(int i = 1; i <= n; i ++)cin >> a[i];
  14. cin >> s + 1;
  15. for(int i = 1; i <= n; i ++)
  16. {
  17. su[i] = su[i - 1] ^ a[i];
  18. }
  19. int sum1 = 0, sum0 = 0;
  20. for(int i = 1; i <= n; i ++)
  21. {
  22. if(s[i] == '1')sum1 ^= a[i];
  23. if(s[i] == '0')sum0 ^= a[i];
  24. }
  25. cin >> q;
  26. while(q --)
  27. {
  28. int tp;
  29. cin >> tp;
  30. if(tp == 1)
  31. {
  32. int l, r;
  33. cin >> l >> r;
  34. sum1 ^= (su[r] ^ su[l - 1]);
  35. sum0 ^= (su[r] ^ su[l - 1]);
  36. }
  37. else if(tp == 2)
  38. {
  39. int x;
  40. cin >> x;
  41. if(x == 0)cout << sum0 << ' ';
  42. else cout << sum1 << ' ';
  43. }
  44. }
  45. cout << '\n';
  46. }
  47. return 0;
  48. }

F. Selling a Menagerie

(拓扑排序)

注:F单独发布题解

发表评论

表情:
评论列表 (有 0 条评论,212人围观)

还没有评论,来说两句吧...

相关阅读