原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处。

最近写学习了一下网络爬虫,但昨天晚上的CF让人感觉实力明显退步,又滚回来刷题了QAQ…

比赛链接:Here

1389A. LCM Problem

给定区间 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图1,求两个不同的数字 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图2 ,使得Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图3%E2%89%A4r#card=math&code=l%E2%89%A4x%3Cy%E2%89%A4r%2Cl%E2%89%A4LCM%28x%2Cy%29%E2%89%A4r) 。

思路

这道题和之前的一道求区间最大 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图4 的签到很像,感兴趣的可以去看看 CF1370A. Maximum GCD

在这个题目中的条件可以整合为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图5,所以我们只需要让 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图6 最小即可 。

Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图7Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图8 的最小公倍数最小为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图9%20%3D%20y%20%3D%202x#card=math&code=lcm%7Bmin%7D%28x%2Cy%29%20%3D%20y%20%3D%202x) ,此时令 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图10 ,可以得到 ![](https://g.yuque.com/gr/latex?lcm%7Bmin%7D%3Dy%3D2l#card=math&code=lcm_%7Bmin%7D%3Dy%3D2l) ,即为最小的答案。如果 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图11, 无解。

  1. int main() {
  2. ios::sync_with_stdio(false), cin.tie(nullptr);
  3. int _; for (cin >> _; _--;) {
  4. ll l, r; cin >> l >> r;
  5. if (2 * l > r) cout << "-1 -1\n";
  6. else cout << l << " " << 2 * l << "\n";
  7. }
  8. }

1389B. Array Walk

给定数组 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图12,起点为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图13 ,你可以向左向右移动,不能越界,最多 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图14 次。

并且限制不能连续的向左移动,且向左移动的次数最多为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图15

每次移动到位置 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图16 可以获取分数 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图17 ,初始分数为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图18 ,询问你可以得到的最大分数和。

思路:

最开始在写的时候挺懵逼的,但考虑差分之后感觉可以就往下推了,正好这个思路是正解?

首先,向左移动不能连续,所以如果有向左移动,就只能以左右间隔的形式反复横跳。其次,以贪心的思想,最大和出现的情况,一定是只在某两个相邻位置之间反复横跳。

我们将移动分为三个阶段:

  • 第一阶段,假设初始向右移动了 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图19 步,那么当前处于的位置为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图20 ,积分和为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图21 (设 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图22,即前 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图23 项和)
  • 第二阶段,随后在 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图24Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图25之间反复横跳,设此过程中向左次数最多为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图26 次,向右次数最多为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图27 ,则 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图28%2C%20q%3D%5Cmin%20(p%2C%20k-i-p)%2C#card=math&code=p%3D%5Cmin%20%5Cleft%28z%2C%5Cleft%5Clceil%5Cfrac%7Bk-i%7D%7B2%7D%5Cright%5Crceil%5Cright%29%2C%20q%3D%5Cmin%20%28p%2C%20k-i-p%29%2C) 得到的积分为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图29

  • 第三阶段,设剩余的步数为 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图30

    • 如果 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图31 ,全部用于向右移动,可以得到的积分为 $s{3}=s u m{k{1}+i+1}-s u m{i+1} $ (如果有剩余步,那 么第二阶段结束后位置一定在 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图32) 。
    • 如果 $k{1}=0 $, 则 $s{3}=0 $, 且同时 $ i+1=k-p-q+1$ ,即 $s u m{i+1}=s u m{k-p-q+1} $, 无论阶段二的落点是在 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图33 还是 $i+1 $ 。

三个阶段的总积分获取为:Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图34

则最大积分和 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图35

复杂度为:Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图36#card=math&code=%5Cmathcal%7BO%7D%28k%29)

  1. const int N = 1e5 + 10;
  2. ll a[N], s[N];
  3. int main() {
  4. ios::sync_with_stdio(false), cin.tie(nullptr);
  5. int _; for (cin >> _; _--;) {
  6. ll n, k, z;
  7. cin >> n >> k >> z;
  8. for (int i = 1; i <= n; ++i) cin >> a[i];
  9. ll ans = 0;
  10. s[0] = 0;
  11. for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i];
  12. for (int i = 1; i < k + 1; i += 1) {
  13. ll p = min(1ll * z, (k + 1 - i) / 2);
  14. ll q = min(1ll * p, k - i - p);
  15. ll res = s[k - p - q + 1] + p * a[i] + q * a[i + 1];
  16. ans = max(ans, res);
  17. }
  18. cout << ans << "\n";
  19. }
  20. }

1389C. Good String

规定字符串 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图37

如果 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图38Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图39 完全相同,则称该字符串为 Good String

判断给定字符串至少删除多少个字符可以变成 Good String 。

思路:

简单推导可以得到 Good String 中:

  • 如果 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图40 是偶数,Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图41Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图42
    Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图43

  • 如果 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图44 为奇数,Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图45 ,如 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图46

而且题目规定 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图47 ,我们通过可以构造 Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图48 种情况,分别算转化需要的最小花费。

复杂度为:Educational Codeforces Round 92 (Rated for Div. 2) A~D - 图49#card=math&code=%5Cmathcal%7BO%7D%2810%5E2n%29)

  1. int main() {
  2. ios::sync_with_stdio(false), cin.tie(nullptr);
  3. int _; for (cin >> _; _--;) {
  4. string s; cin >> s;
  5. int a[2] = {};
  6. int ans = INT_MAX;
  7. for (int i = 0; i < 10; ++i)
  8. for (int j = 0; j < 10; ++j) {
  9. a[0] = i, a[1] = j;
  10. int ct = 0, k = 0;
  11. for (int i = 0; i < s.size(); ++i) {
  12. if (s[i] != a[k & 1] + '0') ct++;
  13. else k = !k;
  14. }
  15. if (int(s.size() - ct) & 1) if (i != j) ct++; //只有全相等才能为奇数
  16. ans = min(ans, ct);
  17. }
  18. cout << ans << "\n";
  19. }
  20. }

1389D. Segment Intersections

待补