VP Educational Codeforces Round 49 (Rated for Div. 2)

news/2025/4/2 17:06:35/文章来源:https://www.cnblogs.com/maburb/p/18803382

A. Palindromic Twist

判断对应位置的差是不是等于0或2。

点击查看代码
void solve() {int n;std::cin >> n;std::string s;std::cin >> s;for (int i = 0, j = n - 1; i < j; ++ i, -- j) {if (std::abs(s[i] - s[j]) != 2 && s[i] != s[j]) {std::cout << "NO\n";return;}}std::cout << "YES\n";
}

B. Numbers on the Chessboard

分类讨论。

点击查看代码
void solve() {i64 n, q;std::cin >> n >> q;i64 a = (n * n + 1) / 2;while (q -- ) {int x, y;std::cin >> x >> y;if (x + y & 1) {i64 d = (n / 2 + (n + 1) / 2) * (x / 2);if (x % 2 == 0) {d -= (n + 1) / 2;d += (y + 1) / 2;} else {d += y / 2;}std::cout << a + d << "\n";} else {i64 d = (n / 2 + (n + 1) / 2) * (x / 2);if (x % 2 == 0) {d -= n / 2;d += y / 2;} else {d += (y + 1) / 2;}std::cout << d << "\n";}}
}

C. Minimum Value Rectangle

题意:给你\(n\)个木棒,用其中四个构造矩形,使得周长的平方除面积最小。

设两条边长为\(x, y(x < y)\)。则要求\({(2(x + y))^2}{xy}\)最小,推理一下:\({(2(x + y))^2}{xy} = \frac{4x^2 + 4y^2 + 8xy}{xy} = 4(\frac{x}{y} + \frac{y}{x}) + 8\),那么要让\(\frac{y}{x}\)最小,我们肯定选相邻的两个值。

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

D. Mouse Hunt

题意:\(n\)个点每个点有一个代价和一个出边。要求选一些点使得所有点都可以到达其中一个点,且这些点的代价和最小。

进行\(tarjan\)求强连通分量后缩点成\(DAG\)图,那么图中没有出边的点代表的连通分量里选一个最小值。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> c(n), a(n);for (int i = 0; i < n; ++ i) {std::cin >> c[i];}for (int i = 0; i < n; ++ i) {std::cin >> a[i];-- a[i];}std::vector<int> dfn(n), low(n), id(n), min(n, 1e9), stk(n + 10), in_stk(n);int top = 0, idx = 0, cnt = 0;auto tarjan = [&](auto & self, int u) -> void {dfn[u] = low[u] = ++ idx;stk[ ++ top] = u; in_stk[u] = 1;int v = a[u];if (!dfn[v]) {self(self, v);low[u] = std::min(low[u], low[v]);} else if (in_stk[v]) {low[u] = std::min(low[u], dfn[v]);}if (dfn[u] == low[u]) {do {v = stk[top -- ];in_stk[v] = 0;id[v] = cnt;min[cnt] = std::min(min[cnt], c[v]);} while (v != u);++ cnt;}};for (int i = 0; i < n; ++ i) {if (!dfn[i]) {tarjan(tarjan, i);}}std::vector<int> in(cnt);for (int i = 0; i < n; ++ i) {if (id[i] != id[a[i]]) {++ in[id[i]];}}int ans = 0;for (int i = 0; i < cnt; ++ i) {if (in[i] == 0) {ans += min[i];}}std::cout << ans << "\n";
}

E. Inverse Coloring

题意:构造一个\(01\)矩阵,有三个条件:

  1. 每行的位置和上一行对应位置要么都相同要么都不同
  2. 每列的位置和前一列对应位置要么都相同要么都不同
  3. 最大的\(0\)的连通块大小小于\(k\),最大的\(1\)连通块大小小于\(k\)

那么首先要发现,确定了第一行第一列后整个矩阵就确定了。
因为一行中连续的一段在接下来的行里也连续,一列中连续的一段在接下来的列里也连续,那么它们构成的子矩阵的元素都是相同的。那么我们需要求出行的最大连续段的方案和列的最大连续段的方案。

解法一:
\(f[i][j][k]\)为前\(i\)个元素最长连续段长度为\(j\),末尾有连续\(k\)个相等的元素的方案数。
那么我们在末尾加一个相同的元素可以转移到\(f[i + 1][(\max(j, k + 1)][k + 1]\),加一个不一样的可以转移到\(f[i + 1][\max(j, 1)][1]\)
那么长度为\(j\)的方案数\(cnt_j\)就是\(\sum_{k=1}^{j} f[n][j][k]\)
答案就是枚举\(i \times j < k\)的对数加上\(cnt_i \times cnt_j\)。然后除二。为什么除二?因为我们只是算连续相同的段,如果行列组合起来,可能一个要求相同,一个要求不相同,那么就不是一样的矩阵了。
代码省略取模类。

点击查看代码
void solve() {int n, K;std::cin >> n >> K;std::vector f(n + 1, std::vector<Z>(n + 1));f[0][0] = 1;for (int i = 0; i < n; ++ i) {std::vector g(n + 1, std::vector<Z>(n + 1));for (int j = 0; j <= i; ++ j) {for (int k = 0; k <= j; ++ k) {if (k + 1 <= n) {g[std::max(k + 1, j)][k + 1] += f[j][k];}g[std::max(1, j)][1] += f[j][k];}}f = g;}std::vector<Z> cnt(n + 1);for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= i; ++ j) {cnt[i] += f[i][j];}}Z ans = 0;for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= n; ++ j) {if (i * j < K) {ans += cnt[i] * cnt[j];}}}std::cout << ans / 2 << "\n";
}

解法二:
考虑用\(f[i][j]\)表示前\(i\)个元素连续段小于等于\(j\)的方案数,这样就可以通过\(f[n][i] - f[n][i - 1]\)求出恰好为\(i\)的方案数。
那么我们考虑前面转移到了\(k\),从\([k+1, i]\)都填相同的数,那么有\(f[i][j] = \sum_{k=i-j}^{i-1} f[k][\min(j, k)]\)
至于这个算出来的结果,需要乘上2。
因为观察解法一的方程,发现会给长度为1的连续段贡献两次,而这个解法只会贡献一次。相当于解法一把格子的两种情况都算上了,所以组合的时候需要去除两个不合法的情况,而这个解法每个格子只算了一种情况,需要乘二。

点击查看代码
void solve() {int n, K;std::cin >> n >> K;std::vector f(n + 1, std::vector<Z>(n + 1));f[0][0] = 1;for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= i; ++ j) {for (int k = i - j; k < i; ++ k) {f[i][j] += f[k][std::min(k, j)];}}}std::vector<Z> cnt(n + 1);for (int i = 1; i <= n; ++ i) {cnt[i] = f[n][i] - f[n][i - 1];}Z ans = 0;for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= n; ++ j) {if (i * j < K) {ans += cnt[i] * cnt[j];}}}std::cout << ans * 2 << "\n";
}

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

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

相关文章

团队协作管理:贝尔宾团队角色模型学习

“没有完美的个人,只有完美的团队。” 任何企业的领导者要想使自己的企业能够快速地发展和成长,就必须对团队建设的重要性有正确的认识。团队角色理论 团队角色理论是管理学中用于分析和优化团队协作的重要理论,可以帮助管理者认识人才、选拔人才,组建高效率合作团队。也可…

钉钉 + AI 网关给 DeepSeek 办入职

通过 Open-WebUI 在企业内部部署一套 DeepSeek 只是第一步,给 DeepSeek 办理入职,在钉钉等企业通讯工具上和 DeepSeek 对话才是真时尚。通过 Open-WebUI 在企业内部部署一套 DeepSeek 只是第一步,给 DeepSeek 办理入职,在钉钉等企业通讯工具上和 DeepSeek 对话才是真时尚。…

网络工程师修仙指北---STP(Spanning Tree Protocol)

网络工程师修仙指北---STP(Spanning Tree Protocol) Hello哇,欢迎来到《网络工程是修仙指北系列》,今天我们接着上一篇VLAN的内容,继续为大家介绍网络交换二层技术中另一个重要的内容---STP 一口小酒🍸,一首歌📻,阿轩带你修成仙! 上一篇中我们讲到,通过VLAN的技术…

「通义灵码+X」公开课开讲啦!和赛博同桌一起完成开发任务 有奖励

在AI技术重塑未来的今天,阿里云通义灵码团队携手高校开发者,推出「通义灵码+X系列公开课」暨赛博同桌计划,为编程学习注入全新活力!活动将于2025年3月12日至4月30日火热进行,无论你是技术小白还是代码达人,都能在这里找到与AI并肩学习的乐趣,赢取限定好礼!让AI成为你的…

云原生 Kafka 问卷调研启动,你的声音很重要!参与赢精美礼品!

Apache Kafka 作为高吞吐的分布式消息系统,支持实时数据采集、传输、存储及处理,广泛应用于日志收集、监控数据聚合、流式数据处理、在线和离线分析等场景,是大数据生态的核心组件。然而,随着云计算的快速发展,传统 Kafka 架构在云环境中的局限性日益凸显。Apache Kafka 作…

掌握FastAPI与Pydantic的跨字段验证技巧

title: 掌握FastAPI与Pydantic的跨字段验证技巧 date: 2025/04/01 00:32:07 updated: 2025/04/01 00:32:07 author: cmdragon excerpt: FastAPI中的Pydantic跨字段一致性验证用于处理用户注册、表单提交等场景中多个字段的联合验证需求。Pydantic通过验证器装饰器和根验证器实…

使用 Ollama 本地模型与 Spring AI Alibaba 的强强结合,打造下一代 RAG 应用

使用 Ollama 本地模型与 Spring AI Alibaba 的强强结合,打造下一代 RAG 应用作者:牧生 Spring AI Alibaba RAG Example 示例项目源码地址: https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-rag-example RAG 应用架构概述 1.1 核…

【2025】简易实用知网爬虫,过程加代码

知网是中国最大的学术文献数据库,包含了大量期刊、会议论文、学位论文和报纸等学术资源。尽管知网提供了强大的在线搜索功能,但用户有时需要通过程序自动化地获取大量文章信息。这时,我们会使用爬虫技术来帮助完成这项任务。 工具选择和前提条件 本次爬取工作,我们选择了 P…

RabbitMQ进阶--分布式事务案例

本节主要讲述一个案例,是使用rabbitmq实现分布式事务,本章从分布式事务以sping的声明式事务,转而到rabbitMQ的分布式事务,一下环境需要的依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp<…

[Rust] 首次接触Rust

最近听闻Rust已经逐步进入了Linux Kernel,而且一个很好用的软件yazi也是rust开发的,所以想了解一下rust的开发和使用。基本操作 官网 官网:快速配置 Rust 开发环境并编写一个小应用! 官方练习环境:Rust演练场 官方教材:学习Rust 下载 curl --proto =https --tlsv1.2 -sSf…

记录给linux/ubuntu的4T新硬盘分区、格式化并挂载

之前给服务器挂载硬盘最大也就是1.2T的,今天客户的一个服务器考虑到未来用户量上传文件比较大,就搞了个4T的盘 一、查询磁盘信息 由于是新盘,df -h 是查不到的然后通过 lsblk 命令就可以看到了二、尝试分区 然后就开始熟练的先分区,结果报错了The size of this disk is 4 …

智能运维,由你定义:SAE自定义日志与监控解决方案

通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。作者:久氢、丛霄、章进 背景 SAE【1】(Serverless 应用引擎)是…