Codeforces Round 987 (Div. 2)题解 A~D

news/2025/1/31 11:45:35/
A- Penchick and Modern Monument

由于给定的数是非递增的,所以 h [ i ] ≥ h [ i + 1 ] h_[i]\geq h[i+1] h[i]h[i+1],如果 h [ i ] > h [ i + 1 ] h[i]>h[i+1] h[i]>h[i+1] 那么二者至少要改其一。因为最终要求的数是非递减的,所以最终数组内都是同一种数的方案是可行的。枚举最后会成为数组中的哪一个数即可。

void solve () {int n;cin >> n;vector <int> h(n + 1);for (int i = 1; i <= n; i++) cin >> h[i];int ans = INF;for (int i = 1; i <= n; i++) {int sum = 0;for (int j = 1; j <= n; j++) if (h[j] != h[i]) sum ++;ans = min(sum, ans);}cout << ans << endl;
}
B- Penchick and Satay Sticks

假设 1 ∼ i − 1 1\sim i-1 1i1 已经放好了,如果 p [ i ] ≠ i p[i]\neq i p[i]=i 的话,现在要把 i i i 位置放好,当且仅当 p [ i + 1 ] = i p[i+1]=i p[i+1]=i 并且 p [ i ] = i + 1 p[i]=i+1 p[i]=i+1 时才能放好。

void solve () {int n;cin >> n;vector <int> p(n + 1);for (int i = 1; i <= n; i++) cin >> p[i];for (int i = 1; i <= n; i++) {if (p[i] == i) continue;// 找到 i 在哪int pos = -1;for (int j = i + 1; j <= n; j++) {if (p[j] == i) {pos = j;break;}}if (p[i] - p[pos] == 1) {swap (p[i], p[pos]);} else {cout << "NO" << endl;return;}}cout << "YES" << endl;
}
C-Penchick and BBQ Buns

这是一道构造题,先思考一个问题,是否存在 ( x , y ) (x,y) (x,y) 使得 x , y , x + y x,y,x+y x,y,x+y 都是平方数?答案是勾股数

再思考一个问题,是否存在 ( x , y , z ) (x,y,z) (x,y,z) 使得 x , y , z , x + y , y + z , x + y + z x,y,z,x+y,y+z,x+y+z x,y,z,x+y,y+z,x+y+z 都是平方数?我打了个表发现是没有的。

回到这个问题,也就是说,最多我们用三份相同的调料包,不可能用四份及以上的调料包。

n n n 是偶数的时候,显然可以相邻地放两个相同的数。

n n n 是奇数的时候,最小的一组勾股数是 9 , 16 , 25 9,16,25 9,16,25 至少需要 n ≥ 26 n\geq26 n26 时才能出现。

n n n 是大于 26 26 26 的奇数,我们可以在 1 , 10 , 26 1,10,26 1,10,26 处放同一个数,然后再在 23 , 27 23,27 23,27 处放同一个数,剩下的数就一直相邻放即可。

n n n 是小于 26 26 26 的奇数,不存在答案。

void solve () {int n;cin >> n;if (n < 27) {if (n & 1) cout << "-1" << endl;else {for (int i = 1; i <= n; i += 2) {cout << i << ' ' << i << ' ';}cout << endl;}} else {vector <int> a(n + 1, 0);if (n & 1) {a[1] = 1;a[10] = 1;a[26] = 1;a[23] = 2;a[27] = 2;int bnt = 3;for (int i = 2; i <= n; ) {if (a[i]) {i ++;continue;}a[i] = bnt;a[i + 1] = bnt;bnt ++;i += 2;}for (int i = 28; i <= n; i += 2) {a[i] = bnt;a[i + 1] = bnt;bnt ++;}for (int i = 1; i <= n; i++) {cout << a[i] << ' ';}cout << endl;} else {for (int i = 1; i <= n; i += 2) {cout << i << ' ' << i << ' ';}cout << endl;}}
}
D-Penchick and Desert Rabbit

兔子可以往后跳到比它当前更低的树,也可以往前跳到当前比它更高的树

这预示着,操作是可逆的、互通的

设集合 A A A 是兔子在 i i i 树能跳到的所有树的集合,显然从 A A A 内的任意一棵树都一定能跳到 i i i 树。

现在的问题就是,我们怎样地遍历才能不超时、不缺漏地合并所有集合

让我们推演一下:

对于一棵最高的树 p 1 p_1 p1,它可以直接跳到它后面所有的树上,所以直接遍历即可。

然后找到次高的树 p 2 p_2 p2,需要判断是否这棵树能跳到最高的树后面,如果可以的话,那么从 p 2 ∼ p 1 p_2\sim p_1 p2p1 都可以合并。

不断重复这个过程,又因为每个数只会被合并一次,所以时间是 O ( n ) O(n) O(n) 的。

如何找到最高、次高、 ⋯ \cdots 的位置?由于值域是 1 ∼ n 1\sim n 1n,所以可以开一个 O ( n ) O(n) O(n) 的桶。

看似上面一直说合并集合,实际上我们可以发现,当前最高的树只能往右边跳,我们只要维护上一个集合的左端点,以及维护上一个集合的最小值即可。

void solve () {int n;cin >> n;vector <int> a(n + 1);vector <int> v[n + 1]; // 桶排序vector <int> ans (n + 1); // 用来计答案for (int i = 1; i <= n; i++) {cin >> a[i];v[a[i]].emplace_back(i);}int l = n + 1, minn = INF; // 最开始上个集合的左端点是 n + 1,最小值无穷大。for (int i = n; i >= 1; i--) {for (int j = v[i].size() - 1; j >= 0; j--) { // 遍历所有大小为 i 的桶if (v[i][j] >= l) continue; // 如果这个值在上个集合内部就跳过ans[v[i][j]] = i; // 首先将答案初始化为自身if (i > minn) { // 如果当前的值大于上个集合内部的最小值for (int k = v[i][j]; k < l; k++) { // 那么它能去的最大值就是上个集合的最大值ans[k] = ans[l]; // ans[l] 是上个集合内最大值,上个集合内所有数的答案都是 ans[l]minn = min(minn, a[k]); // 更新最小值}l = v[i][j]; // 更新左端点} else {int temp = INF; // 如果无法访问到上一个集合内部for (int k = v[i][j]; k < l; k++) { // 那么后续的集合肯定无法访问到上一个集合内部ans[k] = ans[v[i][j]]; // 此时新开一个集合temp = min(temp, a[k]);}minn = temp; l = v[i][j];}}}for (int i = 1; i <= n; i++) {cout << ans[i] << ' ';}cout << endl;}

http://www.ppmy.cn/news/1568143.html

相关文章

游戏引擎介绍:Game Engine

简介 定义&#xff1a;软件框架&#xff0c;一系列为开发游戏的工具的集合 可协作创意生产工具&#xff0c;复杂性艺术&#xff0c;注重realtime实时 目的 为艺术家&#xff0c;设计师&#xff0c;程序员设计工具链 游戏引擎开发参考书 推荐&#xff1a;Game Engine Archite…

vue3项目中编写less

css,less&#xff0c;sass文件一般写在vue3的asset目录下 1.引入依赖 npm install -D less2.定义less文件 3.在其他文件中引入less文件 如在app.vue文件中引入&#xff0c; 可使用绝对路径也可以使用相对路径

解析“in the wild”——编程和生活中的俚语妙用

解析“in the wild”——编程和生活中的俚语妙用 看下面的技术文章中遇到 in the wild这个词&#xff0c;想要研究一下&#xff0c;遂产生此文。 Are there ever pointers to pointers to pointers? There is an old programming joke which says you can rate C programmers…

Chrome浏览器编译系统研究与优化分析

## 摘要 本文深入研究了Chrome浏览器的编译系统&#xff0c;重点分析了GN构建系统和Ninja编译工具的配置与优化策略。通过实验验证&#xff0c;提出了一套完整的多核心编译优化方案&#xff0c;显著提升了Chrome浏览器的编译效率。研究表明&#xff0c;合理配置编译参数和充分利…

Java面试题2025-并发编程进阶(线程池和并发容器类)

线程池 一、什么是线程池 为什么要使用线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可…

深度学习:从基础到前沿

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;【Linux】进程地址空间与虚拟地址空间 &#x1f516;流水不争&#xff0c;争的是滔滔不 一、深度学习的基础知…

.Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇

版本号 Nuget 搜索 “OpenCCNET”, 注意别找错, 好多库的名字都差不多 支持 “繁,简” 的互相转换, 支持多个地区常用词汇的转换, 还支持 日文的新旧转换. OpenCC 在 .Net 中的实现 https://github.com/CosineG/OpenCC.NET <PackageReference Include"OpenCCNET"…

为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️

前言 在使用 Spring 框架时&#xff0c;依赖注入&#xff08;DI&#xff09;是一个非常重要的概念。通过注解&#xff0c;我们可以方便地将类的实例注入到其他类中&#xff0c;提升开发效率。Autowired又是被大家最为熟知的方式&#xff0c;但很多开发者在使用 IntelliJ IDEA …