Codeforces Round 1013 (Div. 3)

news/2025/3/26 1:17:54/文章来源:https://www.cnblogs.com/maburb/p/18792664

A. Olympiad Date

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(10);a[0] = 3;a[1] = 1;a[3] = 1;a[2] = 2;a[5] = 1;std::vector<int> b(n);for (int i = 0; i < n; ++ i) {std::cin >> b[i];}std::vector<int> cnt(10);for (int i = 0; i < n; ++ i) {cnt[b[i]] = std::min(cnt[b[i]] + 1, a[b[i]]);if (cnt == a) {std::cout << i + 1 << "\n";return;}}std::cout << 0 << "\n";
}

B. Team Training

题意:把数组划分为若干个集合,每个集合的价值为集合大小乘集合最小值。求最多划分出来几个价值大于等于\(x\)的集合。

从大到小枚举,因为优先用大的数可以使当前集合大小最小,也就是用最少的数。

点击查看代码
void solve() {int n, x;std::cin >> n >> x;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::ranges::sort(a);int ans = 0;for (int i = n - 1, cnt = 0; i >= 0; -- i) {++ cnt;if ((i64)cnt * a[i] >= x) {++ ans;cnt = 0;}}std::cout << ans << "\n";
}

C. Combination Lock

题意:构造一个长度为\(n\)的排列,使得在接下来\(n-1\)次右移中都有一个位置使得\(p_i = i\)

\(i\)需要右移\(a_i\)次可以到\(i\),那么实际上\(a\)就是\(0\)\(n-1\)的一个排列。发现\(n\)为奇数的情况,从大到小排可以满足这个条件。
而偶数不可以(猜的)

点击查看代码
void solve() {int n;std::cin >> n;if (n % 2 == 0) {std::cout << -1 << "\n";return;}std::vector<int> ans(n);std::ranges::iota(ans, 1);std::reverse(ans.begin(), ans.end());for (int i = 0; i < n; ++ i) {std::cout << ans[i] << " \n"[i == n - 1];}
}

D. Place of the Olympiad

题意:给你一个\(n\times m\)的矩阵,你要放\(k\)个元素进去,使得每行最大连续子段的最大值最小。

二分。
如果一行最多放\(mid\)个元素,那么这一行总共可以放\(\lfloor \frac{m}{mid + 1} \rfloor + m \% (mid + 1)\)个元素。

点击查看代码
void solve() {i64 n, m, k;std::cin >> n >> m >> k;auto check = [&](i64 len) -> i64 {i64 cnt = m / (len + 1) * len + m % (len + 1);return n * cnt;};i64 l = 1, r = m;while (l < r) {i64 mid = l + r >> 1ll;if (check(mid) >= k) {r = mid;} else {l = mid + 1;}}std::cout << l << "\n";
}

E. Interesting Ratio

题意:求\([1, n]\)中有多少对数\(a, b\)满足\(a < b, \frac{lcm(a, b)}{gcd(a, b)}\)是质数。

\(lcm(a, b) = \frac{ab}{gcd(a, b)}, \frac{lcm(a, b)}{gcd(a, b)} = \frac{a}{gcd(a, b)} \times \frac{b}{gcd(a, b)}\),显然只有在\(a\)\(b\)中有一个数是\(gcd\)的时候且另一个数除\(gcd\)是质数的情况才合法。
那么我们就是要求每个\(i\)\([i + 1, n]\)内的质数倍数的个数。
预处理筛质数,然后二分求即可。

点击查看代码
std::vector<int> minp, primes;void sieve(int n) {minp.assign(n + 1, 0);primes.clear();for (int i = 2; i <= n; ++ i) {if (minp[i] == 0) {minp[i] = i;primes.push_back(i);}for (auto p : primes) {if (i * p > n) {break;}minp[i * p] = p;if (p == minp[i]) {break;}}}
}void solve() {int n;std::cin >> n;i64 ans = 0;for (int i = 1; i <= n; ++ i) {ans += std::ranges::upper_bound(primes, n / i) - primes.begin();}std::cout << ans << "\n";
}

F. Igor and Mountain

题意:给你一个\(n\times m\)的矩阵,有些地方可以走有些地方不能走。每一行你最多走两个点,当前行只能到下一行,且每次走的两个的欧拉距离不能超过\(d\)。求从最低层到最高层的走法方案数。

\(f[0/1][i][j]\)表示在第\(i\)行走了\(1\)个或者\(2\)个点现在在第\(j\)列的方案数。
\(sum[0/1][i][j]\)表示\(f[0/1][i]\)的前缀和。
\(L[j], R[j]\)表示跨一行的情况下可以\(j\)可以走到点的左右边界。
那么\(f[0][i][j] = sum[0][i - 1][R[j]] - sum[0][i - 1][L[j] - 1] + sum[1][i - 1][R[j]] - sum[1][i - 1][L[j] - 1]\),意味从上一行到当前点。
然后考虑当前行走两个点的情况,那么\(f[1][i][j] = sum[0][i][j + k] - sum[0][i][j - k - 1] - f[0][i][j]\)
代码省略取模类。

点击查看代码
void solve() {int n, m, k;std::cin >> n >> m >> k;std::vector<std::string> s(n + 1);for (int i = 1; i <= n; ++ i) {std::cin >> s[i];}std::reverse(s.begin() + 1, s.end());auto get_dist = [&](int x1, int y1, int x2, int y2) -> int {int dx = x1 - x2, dy = y1 - y2;return dx * dx + dy * dy;};std::vector f(2, std::vector(n + 1, std::vector<Z>(m + 1)));std::vector sum(2, std::vector(n + 1, std::vector<Z>(m + 1)));for (int j = 1; j <= m; ++ j) {f[0][1][j] = s[1][j - 1] == 'X';sum[0][1][j] = sum[0][1][j - 1] + f[0][1][j];}for (int j = 1; j <= m; ++ j) {if (s[1][j - 1] == 'X') {int l = std::max(1, j - k), r = std::min(m, j + k);f[1][1][j] = sum[0][1][r] - sum[0][1][l - 1] - f[0][1][j];}sum[1][1][j] = sum[1][1][j - 1] + f[1][1][j];}std::vector<int> L(m + 1), R(m + 1);for (int i = 1, j = 1; i <= m; ++ i) {while (get_dist(1, i, 0, j) > k * k) {++ j;}L[i] = j;}for (int i = m, j = m; i >= 1; -- i) {while (get_dist(1, i, 0, j) > k * k) {-- j;}R[i] = j;}for (int i = 2; i <= n; ++ i) {for (int j = 1; j <= m; ++ j) {if (s[i][j - 1] == 'X') {f[0][i][j] += sum[0][i - 1][R[j]] - sum[0][i - 1][L[j] - 1];f[0][i][j] += sum[1][i - 1][R[j]] - sum[1][i - 1][L[j] - 1];}sum[0][i][j] = sum[0][i][j - 1] + f[0][i][j];}for (int j = 1; j <= m; ++ j) {if (s[i][j - 1] == 'X') {int l = std::max(1, j - k), r = std::min(m, j + k);f[1][i][j] = sum[0][i][r] - sum[0][i][l - 1] - f[0][i][j];}sum[1][i][j] = sum[1][i][j - 1] + f[1][i][j];}}Z ans = sum[0][n][m] + sum[1][n][m];std::cout << ans << "\n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905743.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CodeForces训练记录】Codeforces Round 1013 (Div. 3)

训练情况赛后反思 A题题目读半天,发现日期有前导零,div3还是比较基础一点,但是感觉自己还是不够熟练,D题看出来二分但是调了挺久的 A题 判断取多少个数之后才能构成 20250301,我们维护数字的出现次数,直到所有数字的出现次数全部大于等于 20250301 的出现次数时输出位置即…

字符串问题的江湖奇宝:进制哈希

江湖中,剑客以快制胜,而算法竞赛里,字符串哈希(String Hashing)便是那柄出招如电的快剑。 各种字符串问题纷乱复杂,各种字符串算法招式繁复,需苦练内功心法。但字符串哈希算法却只凭一招:将字符串化作数字,以数论为刃,至简之道斩尽来犯之敌。 但此招并非无懈可击。若…

HW-1

1.选项A是正确的,它表示的是极小项m6的正确形式。极小项m6对应的是变量a=0,b=1,c=1,d=0的情况,因此其表达式应为(\overline{a} \cdot b \cdot c \cdot \overline{d}),即选项A。 其他选项的分析:选项B是一个或项,不符合极小项的定义。 选项C缺少变量a和d,不是一个完整的…

为什么nn.Linear 的weight 是 (out_features, in_features)

在PyTorch的nn.Linear中,权重矩阵的形状为(out_features, in_features)。这是因为线性变换的实现方式为:具体来说:当创建nn.Linear(10, 60)时,in_features=10,out_features=60,因此权重的形状是(60, 10)。 输入张量t的形状为(2, 5, 10),与转置后的权重a.weight.T(形状(…

字符串问题的终极法宝:进制哈希

江湖中,剑客以快制胜,而算法竞赛里,字符串哈希(String Hashing)便是那柄出招如电的快剑。 各种字符串问题纷乱复杂,各种字符串算法招式繁复,需苦练内功心法。但字符串哈希算法却只凭一招:将字符串化作数字,以数论为刃,至简之道斩尽来犯之敌。 但此招并非无懈可击。若…

布局机器人,vivo用三十年技术沉淀回答“时代之问”

科技创新给产业界带来最大的影响就是“跨界焦虑”。不敢错过,这是企业面对风口的普遍心态。生怕一波没跟上,就被时代淘汰了。 但不错过,并不等于抓得住。比如元宇宙概念经历资本狂欢,无数科技巨头卷入,退潮时一地鸡毛。再比如在新能源汽车赛道卷起千亿投资风暴时,也有很多…

石油化工厂区防爆入侵报警系统

石油化工厂区防爆入侵报警系统采用AI智能防爆预警摄像头嵌入AI人体识别深度算法,对人体目标特征的检测分析识别预警。系统设备采用AI算法,通过大量真实的场景样本训练后,能够在各种应用场景下及时准确地对场景中发生的人体入侵行为发出告警信息。通过对实时视频图像进行智能…

矿山皮带运输机安全监测预警系统

智慧矿山皮带运输机安全监测预警系统是基于AI视频监测分析识别的智能皮带管理系统,该系统通过将人工智能识别算法提高实时分析的效率,达到现场快速识别、分析、预警的目的,为矿山皮带运输系统提供可视化的安全生产保障,该系统已经实现了皮带运输机大媒块、传输带异物、传输…

OP253自动安装凸轮弹簧常见问题

1.夹爪抓取弹簧后不停扔料 两台弹簧振动盘里面的弹簧是镜像件,如果出现混料被取走,会导致卷簧时卡死。夹爪夹住弹簧并提起时,有两个接近开关会检测弹簧是否正确,如果不正确,会将弹簧扔进废料桶。上图两个接近开关是埋入式,只有中心位置检测。应该左边不亮,右边亮,如果任…

web作业

制作一个学生管理系统包括按钮和输入框学生成绩管理系统body { font-family: Arial, sans-serif; margin: 20px } \3c pre>\3c code> h1 { text-align: center } .add-student, .search, .filters { margin-bottom: 20px } table { width: 100%; border-collapse: col…