VP Codeforces Round 1012 (Div. 2)

news/2025/3/29 12:17:24/文章来源:https://www.cnblogs.com/maburb/p/18790361

A. Treasure Hunt

点击查看代码
void solve() {int x, y, a;std::cin >> x >> y >> a;a %= (x + y);if (a < x) {std::cout << "NO\n";} else {std::cout << "YES\n";}
}

B. Pushing Balls

题意:一个\(n\times m\)的矩阵,每次从某一行的最左边或者某一列的最上面推进来一个\(1\),也就是说这个\(1\)会把这个方向挨着它的\(1\)都推一格。现在给你一格矩阵,判断能不能通过一些操作得到它。

每个1左边或者右边肯定是一段连续的1一直到边界。

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

C. Dining Hall

题意:\((x, y)\)代表一组,这一组有\(4\)个位置,分别是\((3x+1,3y+1), (3x+1,3y+2), (3x+2,3y+1), (3x+2,3y+2)\)。现在有两种类型的人,第一种类型的人会走到距离最近的空位置坐下,另一个类型的人会选择没有一格位置有人坐的且左下角最近的组的位置坐下。求每个人坐的位置的下标。距离定义为曼哈顿距离,每组右上角的距离要加上2。

这题难在读题。

我们用两个\(set\)维护,一个\(set\)存空的组的位置,一个存没人坐但是组内有其他位置被坐了的位置。那么我们只需要每次在有人坐了一个新组的情况把其它位置都加到第二个\(set\)里就行。每个下标模\(3\)后就得到了它所在的组。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::set<std::array<int, 3>> s1, s2;for (int i = 0; i + 1 <= n; ++ i) {for (int j = 0; (i + 1) * (j + 1) <= n; ++ j) {for (int x = 1; x <= 2; ++ x) {for (int y = 1; y <= 2; ++ y) {s1.insert({3 * i + 3 * j + x + y + 2 * (x == 2 && y == 2), 3 * i + x, 3 * j + y});}}}}auto work = [&](int x, int y) -> void {int r = x / 3, c = y / 3;for (int i = 1; i <= 2; ++ i) {for (int j = 1; j <= 2; ++ j) {if (!s1.count({3 * r + 3 * c + i + j + 2 * (i == 2 && j == 2), 3 * r + i, 3 * c + j})) {continue;}if (3 * r + i == x && 3 * c + j == y) {continue;}s1.erase({3 * r + 3 * c + i + j + 2 * (i == 2 && j == 2), 3 * r + i, 3 * c + j});s2.insert({3 * r + 3 * c + i + j + 2 * (i == 2 && j == 2), 3 * r + i, 3 * c + j});}}};for (int i = 0; i < n; ++ i) {if (a[i] == 0) {auto [d, x, y] = *s1.begin();std::cout << x << " " << y << "\n";s1.erase(s1.begin());work(x, y);} else {if (s2.size() && *s2.begin() < *s1.begin()) {auto [d, x, y] = *s2.begin();s2.erase(s2.begin());std::cout << x << " " << y << "\n";} else {auto [d, x, y] = *s1.begin();std::cout << x << " " << y << "\n";s1.erase(s1.begin());work(x, y);}}}
}

D. Simple Permutation

题意:要求构造一个排列,使得\(i \in [1, n], \lceil \frac{\sum_{i=1}^{i} p_i}{i} \rceil\)为质数的位置至少有\(\lfloor \frac{n}{3} \rfloor - 1\)个。

乱搞搞过的。
如果要让\(\lceil \frac{\sum_{i=1}^{i} p_i}{i} \rceil\)为质数,那么假设\([1, i-1]\)的和为\(sum\),并且我们得到的质数为\(P\),那么\(p_i\)的取值范围为\([i \times P - sum, i \times (P + 1) - 1]\),我们可以用\(set\)存数,然后找满足条件的最小的数。\(P\)如何确定?可以取大于等于\(n\)的第一个质数,然后如果\(sum\)减少当前可以用的最小值除\(i\)大于\(P\)\(P\)就跳到下一个质数。

点击查看代码
const int N = 1e6 + 5;std::vector<int> primes;
bool st[N];void init(int n) {for (int i = 2; i <= n; ++ i) {if (!st[i]) {primes.push_back(i);}for (auto & p : primes) {if (p * i > n) {break;}st[p * i] = true;if (i % p == 0) {break;}}}
}void solve() {int n;std::cin >> n;std::vector<int> a(n);std::set<int> s;for (int i = 1; i <= n; ++ i) {s.insert(i);}int p = std::ranges::upper_bound(primes, n) - primes.begin();-- p;a[0] = primes[p];s.erase(a[0]);i64 sum = a[0];int cnt = 1;for (int i = 2, j = 0; i <= n; ++ i) {while (j < primes.size() && (sum + *s.begin() + i - 1) / i > primes[j]) {++ j;}if (j == primes.size()) {a[i - 1] = *s.begin();s.erase(s.begin());continue;}i64 l = (i64)i * primes[j], r = (i64)i * (primes[j] + 1) - 1;auto it = s.lower_bound(l - sum);if (it == s.end() || sum + *it > r) {a[i - 1] = *s.begin();sum += *s.begin();s.erase(s.begin());} else {++ cnt;a[i - 1] = *it;sum += *it;s.erase(it);}}// std::cout << cnt << "\n";assert(cnt >= n / 3 - 1);for (int i = 0; i < n; ++ i) {std::cout << a[i] << " \n"[i == n - 1];}
}

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

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

相关文章

安卓工程目录结构

根目录 根目录下有多个重要的文件和文件夹,各自承担着不同的功能。.gradle 和 .idea 这两个文件夹属于 IDE(集成开发环境)生成的文件,其中 .gradle 包含 Gradle 构建系统的配置和缓存信息;.idea 则是 IntelliJ IDEA 或者 Android Studio 所产生的项目配置文件。 app 这是安…

LLM大模型:post-train实战 - 使用GRPO微调LLM

deepseek带火了GRPO,更带火了reinforcement learning,让研究人员发现RL能在pre-train的基础上较大提升LLM的逻辑推理能力!当前,互联网高速发展二十多年产生的优质数据已经使用殆尽,所以更大规模的LLM一直难产(GPT-5现在都还没发布,优质token耗尽是核心原因之一)。市面上…

MQ 消息幂等性保证

MQ 消息幂等性保证 1. 什么是幂等性 在程序开发中,是指同一个业务,执行一次或多次对业务状态的影响是一致的。例如:根据 id 删除数据 查询数据在实际业务中,避免不了出现用户连续点击退款、重复点击删除等情况,这种情况下,就需要对多个消息进行处理,避免短时间内多次执行…

3.24 曲线/曲面积分

1 第一类曲线积分 (理解成求曲线的质量) 要把ds(弧微分)转化成dt(参数方程里面的自变量)(积分里面只留下的变量),也可以转化成dx什么的,注意ds转化成dx的公式 2 第一类曲面积分 还是先求投影,比如投影到xoy平面上,就求z=z(x,y) 2.1 普通对称性奇函数为0,偶函数*2 2.…

SmolVLM2: 让视频理解能力触手可及

一句话总结: SmolVLM 现已具备更强的视觉理解能力📺 SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型,转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规模的模型 (22 亿/5 亿…

React-Native开发鸿蒙NEXT-video

React-Native开发鸿蒙NEXT-video 前几周的开发,基本把一个”只读型“社区开发的差不多了。帖子列表,详情,搜索都迁移实现了,但还差了一点------视频类型帖子的展示。之前开发RN社区中,对于视频的处理用的是react-native-video,这个三方组件也已经实现了鸿蒙化,部分逻辑可…

React-Native开发鸿蒙NEXT-cookie设置

React-Native开发鸿蒙NEXT-cookie设置 应用有个积分商城,做一些积分兑换的业务,就一个基于react-native-webview开发的页面,在页面加载的时候通过js注入来设置cookie带入用户信息。 早先应甲方要求web网站关闭了,现在又要继续运行。于是就把web服务启动了,然后发现应用里积…

第六天

单词 以下是今天需学习的35个单词复习,同时前几天的单词阅读 理解文章大意,记录不认识的单词。今天这个阅读非常应当下的情景。 How to Teach Yourself Anything in Less than Three Months 如何在3个月内学习任何一件事(一) Self-education can be wonderful and frustrat…

React Native开发鸿蒙Next---富文本浏览

React Native开发鸿蒙Next---富文本浏览 最近在继续开发App剩余的社区功能。地铁的社区相对较为特殊,只有公告/政策规章/操作指南等资讯阅读功能,无法进行交互。对于原先的社区RN,除了移植适配鸿蒙,还需要做大量的功能屏蔽等改造。新的社区后台大量采用富文本进行内容编辑,…

17.指针

正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址。 请看下面的实例,它将输出定义的变量地址:#include <stdio.h>int main(){int var_runoob = 10;int *p; //定义指针变量p = &var…

3.24 学习记录

实现了学习记录APP的登录注册功能

2025西安交大集训Day2:DFS,BFS记忆化搜索,迭代加深搜索,二分搜索

2025西安交大集训Day2:DFS,BFS记忆化搜索,迭代加深搜索,二分搜索