比赛链接

A

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. bool solve() {
  5. int n;
  6. cin >> n;
  7. int cnt = 0;
  8. for (int i = 1;i <= n;i++) {
  9. int x;
  10. cin >> x;
  11. if (x == -1) cnt++;
  12. }
  13. int diff = max(0, (2 * cnt - n + 1) / 2);
  14. cout << diff + ((cnt - diff) % 2 == 1) << '\n';
  15. return true;
  16. }
  17. int main() {
  18. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  19. int t = 1;
  20. cin >> t;
  21. while (t--) {
  22. if (!solve()) cout << -1 << '\n';
  23. }
  24. return 0;
  25. }

B

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. bool solve() {
  5. string a, b;
  6. cin >> a >> b;
  7. int n = max(a.size(), b.size());
  8. a = "?" + string(n - a.size(), '0') + a;
  9. b = "?" + b;
  10. int ans = 0;
  11. for (int i = 1;i <= n;i++) {
  12. if (a[i] != b[i]) {
  13. ans += b[i] - a[i] + 9 * (n - i);
  14. break;
  15. }
  16. }
  17. cout << ans << '\n';
  18. return true;
  19. }
  20. int main() {
  21. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  22. int t = 1;
  23. cin >> t;
  24. while (t--) {
  25. if (!solve()) cout << -1 << '\n';
  26. }
  27. return 0;
  28. }

C

题目

给两个串 \(S,T\) ,AB轮流操作,A先操作。

A:选一个串,选择其中一个位置,修改成任意想要的字符。

B:选择一个串,反转他。

问最少操作几次,使得 \(S=T\) 。

题解

知识点:贪心。

显然,B不会修改字符,并且操作两次等于没操作。

因此,关键在于A的两种情况的操作次数:

  1. 把两个字符串的对应位置修改成一样。
  2. 反转其中一个后,把两个字符串的对应位置修改成一样。

这两种情况,对B的要求:

  1. 前者需要B操作偶数次,因此若A的操作次数是奇数,那么B要减一次操作。
  2. 后者需要B操作奇数次,因此若A的操作次数是偶数,那么B要减一次操作。注意这种A可能操作 \(0\) 次,此时通过前面计算得出的是 \(-1\) 是不合法的,为了方便我们对前面的结果与 \(2\) 取最大值即可。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. bool solve() {
  5. int n;
  6. cin >> n;
  7. string s, t;
  8. cin >> s >> t;
  9. s = "?" + s;
  10. t = "?" + t;
  11. int cnt1 = 0, cnt2 = 0;
  12. for (int i = 1;i <= n;i++) {
  13. cnt1 += s[i] == t[i];
  14. cnt2 += s[i] == t[n - i + 1];
  15. }
  16. int ans1 = 2 * (n - cnt1) - ((n - cnt1) & 1);
  17. int ans2 = max(2, 2 * (n - cnt2) - (!((n - cnt2) & 1)));
  18. cout << min(ans1, ans2) << '\n';
  19. return true;
  20. }
  21. int main() {
  22. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  23. int t = 1;
  24. cin >> t;
  25. while (t--) {
  26. if (!solve()) cout << -1 << '\n';
  27. }
  28. return 0;
  29. }

D

题目

在 \([1,m]\) 上给定 \(n\) 个区间 \([l_i,r_i]\) 。

可以选择 \([1,m]\) 中若干个不同数字,那么每个区间的值为区间出现的所选数字个数减去剩余的所选数字个数。

问如何选择数字,使得选择后区间值的最大值与最小值的差值最大。

题解

知识点:枚举,贪心。

考虑枚举每个区间作为最大值,对于一个区间 \(A\) 作为最大值,即选择其中所有数字。此时,对于其他任意一个区间 \(B\) ,\(A\) 与 \(B\) 的区间值的差值为 \(|A| - (|A \cap B|- (|A|-|A \cap B|)) = 2(|A| - |A \cap B|)\) ,等价于我们要选择一个 \(B\) ,最大化 \(A\) 不在 \(B\) 中的部分,考虑三种情况以及对应的方案:

  1. \(B\) 在 \(A\) 中或 \(A\) 在 \(B\) 中,我们要找到最短的 \(|B|_{min}\) ,则差值最大值为 \(|A| - |B|\) 。
  2. \(B\) 与 \(A\) 的左侧相交,我们要找到最小的右端点 \(minR\) ,则差值最大值为 \(r_i - minR\)。
  3. \(B\) 与 \(A\) 的右侧相交,我们要找到最大的左端点 \(maxL\),则差值最大值 \(maxL - l_i\) 。

更进一步,我们可以得到,对于一个 \(B\) ,无论 \(B\) 属于上面哪一种情况,三种方案只会有一个会得到最大值。因此, \(A\) 与 \(B\) 的关系并不重要,我们不需要每次对一个特定的 \(A\) 将所有的 \(B\) 按三种情况分类后分别求解,而是可以无视 \(A\) 是什么,直接对所有 \(B\) 采取三种方案,其中总会有一个正确的最大值。

既然如此,那么我们事先得到所有区间的最短长度、最小右端点、最大左端点,随后枚举每个区间作为最大值区间 \(A\) ,直接使用它们计算答案取最大值即可,如此会方便很多。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. int L[100007], R[100007];
  5. bool solve() {
  6. int n, m;
  7. cin >> n >> m;
  8. int minlen = 2e9, maxlen = 0;
  9. for (int i = 1;i <= n;i++) {
  10. cin >> L[i] >> R[i];
  11. minlen = min(minlen, R[i] - L[i] + 1);
  12. maxlen = max(maxlen, R[i] - L[i] + 1);
  13. };
  14. int maxL = *max_element(L + 1, L + n + 1);
  15. int minR = *min_element(R + 1, R + n + 1);
  16. int ans = maxlen - minlen;
  17. for (int i = 1;i <= n;i++) ans = max(ans, min(R[i] - L[i] + 1, max(maxL - L[i], R[i] - minR)));
  18. cout << 2 * ans << '\n';
  19. return true;
  20. }
  21. int main() {
  22. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  23. int t = 1;
  24. cin >> t;
  25. while (t--) {
  26. if (!solve()) cout << -1 << '\n';
  27. }
  28. return 0;
  29. }

E

题目

给一个有 \(n\) 个数的数组 \(a\) ,问最小的 \(x\) 使得 \(x\) 不等于 \(a\) 任意子区间的 \(\text{lcm}\) 。

题解

知识点:GCD和LCM,线性dp,枚举。

问题等价于找到全部子区间LCM的MEX,即第一个未出现的数字。

全部子区间的LCM种类不会超过 \(n^2\) 个,因此其MEX大小不会超过 \(n^2\) ,我们只需要求出不大于 \(n^2\) 的LCM即可,超过的 \(n^2\) 的LCM可以断定是无效的。

我们考虑固定子区间右端点,对于任意左端点,设子区间产生不同的LCM为 \(x_1 < \cdots < x_k\) 。同时,因为是固定了右端点,因此大的子区间的LCM一定是小的子区间的LCM的倍数,有不等式 \(x_i \geq 2x_{i-1}, i = 2,3,\cdots,k\) ,于是我们有 \(n^2 \geq x_k \geq 2^{k-1}\) ,所以 \(k\leq 1+ 2\log_2n\) 。

通过上述方法,我们可以得到每次迭代中,枚举的LCM不超过 \(1+ 2\log_2n\) ,总的LCM不超过 \(n(1+2\log_2n)\) 。因此,我们这个方法得到全部有效的LCM的复杂度是 \(O(n \log n)\) 的。当然,我们需要用 set 维护不同种类,所以最终复杂度是 \(O(n \log^2 n)\) 。

更进一步地,LCM总种类数 \(n(1+2\log_2n)\) 又可以反过来推断出MEX大小的不会超过 \(n(1+2\log_2n)\) ,这个大小在这道题不超过 \(2 \times 10^7\) ,因此可以用一个 int 范围的数限制大小。

时间复杂度 \(O(n \log^2 n)\)

空间复杂度 \(O(n \log n)\)

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. int a[300007];
  5. bool solve() {
  6. int n;
  7. cin >> n;
  8. for (int i = 1;i <= n;i++) cin >> a[i];
  9. set<int> st, pre;
  10. for (int i = 1;i <= n;i++) {
  11. set<int> now;
  12. now.insert(a[i]);
  13. for (auto x : pre) {
  14. ll y = lcm((ll)x, a[i]);
  15. if (y <= 2e6) now.insert(y);
  16. }
  17. for (auto x : now) st.insert(x);
  18. swap(pre, now);
  19. }
  20. int ans = 1;
  21. while (st.count(ans)) ans++;
  22. cout << ans << '\n';
  23. return true;
  24. }
  25. int main() {
  26. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  27. int t = 1;
  28. cin >> t;
  29. while (t--) {
  30. if (!solve()) cout << -1 << '\n';
  31. }
  32. return 0;
  33. }

Codeforces Round #879 (Div. 2) A-E的更多相关文章

  1. Codeforces Round #879 (Div. 2) C. Short Program

    题目链接:http://codeforces.com/contest/879/problem/C C. Short Program time limit per test2 seconds memor ...

  2. Codeforces Round #443 (Div. 2) 【A、B、C、D】

    Codeforces Round #443 (Div. 2) codeforces 879 A. Borya's Diagnosis[水题] #include<cstdio> #inclu ...

  3. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  4. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  5. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  6. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  7. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  8. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  9. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  10. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

随机推荐

  1. IPv4已正式用尽

    网际协议版本4 (英语:Internet Protocol version 4,缩写:IPv4,又称互联网通信协议第四版)是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署和使用的版本. ...

  2. [Java SE]JDK版本特性解读:@PostStruct[JDK1.6-JDK1.8]

    1 @PostStruct 1.1 概述 定义及用途 @PostConstruct(javax.annotation.PostConstruct)注解好多人以为是Spring提供的.而实际上是Java ...

  3. git撤销某一次commit提交

    一.使用git rebase命令 如果您想彻底删除 Git 中的某次提交的内容,可以使用 git rebase 命令并将该提交删除. 以下是删除 Git 提交内容的步骤: 找到要删除的提交的哈希值.可 ...

  4. spring事务里面开启线程插入,报错了是否会回滚?

    1.前言 一道非常有意思的面试题目.大概是这样子的,如果在一个事务中,开启线程进行插入更新等操作,如果报错了,事务是否会进行回滚 2.代码 示例1 @RequestMapping("/tes ...

  5. Semantic Kernel 入门系列:🥑突破提示词的限制

    无尽的上下文 LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力. 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答. 因此如何给LLM ...

  6. 【vue3-element-admin 】基于 Vue3 + Vite4 + TypeScript + Element-Plus 从0到1搭建后台管理系统(前后端开源@有来开源组织)

    vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 + Element Plus 版本的后台管理前端解决方案,技术栈为 Vue3 + Vite4 + T ...

  7. [操作系统] - 进程状态&进程描述

    2.1 进程(Process) 2.1.1 定义 chatGPT版:一个具有独立功能的程序关于某个数据集合的一次运行活动 人话版:程序在并发环境中的执行过程& 进程是程序的一次执行 2.1.2 ...

  8. day05-优惠券秒杀01

    功能03-优惠券秒杀01 4.功能03-优惠券秒杀 4.1全局唯一ID 4.1.1全局ID生成器 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单,并保存到tb_voucher_order这张表 ...

  9. Arnold置乱

    一.Arnold置乱概述 Arnold变换是俄国数学家弗拉基米尔·阿诺德(Vladimir Igorevich Arnold)提出,Arnold将其应用在遍历理论研究中.由于Arnold本人最初对一张 ...

  10. 2023-03-14:读取摄像头,并且显示视频。代码用go语言编写。

    2023-03-14:读取摄像头,并且显示视频.代码用go语言编写. 答案2023-03-14: 大体流程如下: 导入所需的库和包. 初始化 ffmpeg 和 SDL2 库. 打开摄像头并创建 AVF ...