Codeforces Pinely Round 5(div.1 + div.2) A~D题解

news/2025/10/31 18:31:37/文章来源:https://www.cnblogs.com/x1a0qiya/p/19180950

写在开头

有不足的地方各位佬多多指教呀!

持续更新(bushi)

A

题面

给定李华的初始rating \(R\) ,div.2的计分上限 \(X\),李华每次rating的变化最大值 \(D\),以及cf比赛的次数 \(n\),问李华最多可以正式参加多少场cf。

\( 0 \le R \le 10^9 \\ 1 \le X \le 10^9 \\ 1 \le D,n \le 1000 \\ \sum{n} \le 3 \times 10^4 \)

解析

由于div.1没有计分下限,所以让李华的rating尽可能低即可。

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

代码

#include <bits/stdc++.h>
using namespace std;int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t;cin >> t;while(t--){int rat, x, d, n;cin >> rat >> x >> d >> n;string s;cin >> s;int num = 0;for(int i = 0; i < n; i++)if(s[i] == '1'){num++;if(rat >= x)rat -= d;}else{if(rat < x)num++;}cout << num << '\n';}return 0;
}

B

题面

给定一个 \(n \times n\) 的表格,每个格子被染上黑白两色中的一个,你可以选择任意多个白色格子并将其染黑,问是否存在一种染色使得所有的黑格是联通的(对角相连不算联通),并且在任一行或一列存在连续3个黑格。

\( 1 \le n \le 100 \\ \sum{n} \le 2000 \)

解析

\(0\) 表示白格,用 \(1\) 表示黑格(这里与原题符号不一样),那么关键发现是所有的满足条件的方案一定是如下形状的:


只有四个黑格构成一个正方形。

\( 0000\\ 0110\\ 0110\\ 0000\\ \)


一条蛇形

\( 110000000\\ 011000000\\ 001100000\\ 000110000\\ 000011000\\ 000001100\\ 000000110\\ 000000011\\ 000000001\\ \)


还是蛇形,方向变了

\( 000000110\\ 000001100\\ 000011000\\ 000110000\\ 001100000\\ 011000000\\ 110000000\\ 000000000\\ 000000000\\ \)


因此我们只需要判断这些情况即可。

第一种情况可以直接判断是否只有四个黑格并且他们构成正方形,如果初始情况不是4个黑格而是一个子图,那么可以并入情况二和三。

第二种情况可以判断所有的黑格是否全部落在相邻的两个对角线上,如果用 \(a_{ij}\) 表示格子,那么这等价于 \(abs(i - j)\) 的值是否是相邻的两个整数。

情况三和二类似,只是判断的时候将 \(i - j\) 改为 \(i + j\) 即可。

我判断情况二和三的方案是用了两个 \(set\),将每个黑格的 \(i - j\)\(i + j\) 插入集合即可。

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

代码

#include <bits/stdc++.h>
using namespace std;int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t;cin >> t;while(t--){int n;cin >> n;set <int> s1, s2;vector <pair <int, int>> pos;vector <vector <char>> a(n, vector <char> (n));for(int i = 0; i < n; i++)for(int j = 0; j < n; j++){cin >> a[i][j];                if(a[i][j] == '#')s1.insert(i + j), s2.insert(i - j),pos.push_back({i, j});}bool tag = 0;if(s1.size() == 2){vector <int> v(s1.begin(), s1.end());if(abs(v[0] - v[1]) == 1)tag = 1;}if(s2.size() == 2){vector <int> v(s2.begin(), s2.end());if(abs(v[0] - v[1]) == 1)tag = 1;}if(s1.size() < 2 || s2.size() < 2)tag = 1;if(pos.size() == 4){sort(pos.begin(), pos.end());int x = pos[0].first, y = pos[0].second;if(pos[1] == make_pair(x, y + 1) && pos[2] == make_pair(x + 1, y) && pos[3] == make_pair(x + 1, y + 1))tag = 1;}cout << (tag ? "Yes\n" : "No\n");}return 0;
}

C

题面

你要购买 \(n\) 个物品,每个物品价值 \(a_i\),给定 \(x\) 为忠诚度,每个物品价值不超过 \(x\),定义忠诚度等级为 \(\lfloor \frac{s}{x} \rfloor\),其中 \(s\) 为当前已经购买的物品的价值综合,如果购买某个物品时忠诚度等级升级了,那么当前购买物品的价值就是升级获得的积分,求可获得的最多的积分以及对应的一个方案。

\( 1 \le n \le 10^5 \\ 1 \le x \le 10^9 \\ 1 \le a_i \le x \\ \sum n \le 10^5 \)

解析

最终购买的物品总价值是固定的,因此升级次数 \(k\) 是固定的,最贪心的是这 \(k\) 次升级时购买的物品是价值最多的 \(k\) 个物品。这可以由以下构造完成:

定义 \(sum\) 为当前购买的物品的价值和对 \(x\) 取模后的结果(即 \(sum = s \mod{x}\)),每次选择要买的物品时使用如下策略:如果还未被购买的物品中价值最大的(记其价值为 \(a_{max}\))满足 \(sum + a_{max} \ge x\),那么就购买它,否则购买价值最小的,每次买完后更新 \(sum\)。不难发现如果价值最大的都无法升级时价值小的也无法升级,所以取出的都是价值最大的。

时间复杂度 \(O(n \log{n})\),瓶颈在排序。

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long longint main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t;cin >> t;while(t--){int n, x;cin >> n >> x;ll sum = 0ll;vector <int> a(n + 1, 0);for(int i = 1; i <= n; i++){cin >> a[i];sum += a[i];}sort(a.begin() + 1, a.end());int k = sum / x;ll ans = 0ll;for(int i = n; i > n - k; i--)ans += a[i];cout << ans << '\n';int l = 1, r = n, num = 0;while(l <= r){if(num + a[r] >= x){num = (num + a[r]) % x;cout << a[r] << ' ';r--;}else{num += a[l];cout << a[l] << ' ';l++;}}cout << '\n';}return 0;
}

D

题面

给定一个长为n的数组b,问最少移除多少个元素,才能使得不存在 \(i\)\(j\),使得 \(1 \le i \lt j \le n\)\(b_j - b_i = 1\)(不妨把满足这种条件的 \(i\)\(j\) 对成为坏的)。

\( 1 \le n \le 3 \times 10^5 \\ 1 \le b_i \le n \\ \sum{n} \le 3 \times 10^5 \)

解析一

考虑问题的反面,最多可以取多少个元素,我们来进行 \(dp\)

考虑一个 \(pair\) 数组 \(a\)\(a_i = \{ b_i, i \}\),将这个数组排序,第一关键字按增序排列,第二关键字按降序排列,记 \(dp_i\) 表示排列后前 \(i\) 个数最多可以取多少个,那么有状态转移方程如下:

\[dp_i = 1 + \max_{a_j.first + 1 \ne a_i.first \cup a_j.second \gt a_i.second} {dp_j} \]

最后 \(n - \max{dp}\) 就是答案。

那为什么是这样?考虑这样一组样例:
n = 3, a[n] = {2, 1, 3}
如果我们直接用 \(dp_i = 1 + \max_{j \lt i, a_j.first + 1 \ne a_i.first} {dp_j}\) 来转移会有一个问题,在更新 \(3\)\(dp\) 值时因为有 \(1\) 的影响会直接更新为 \(3\),但是 \((2, 3)\) 也是不被允许的,更新错误的原因在于 \(2\)\(3\) 没有紧挨着。所以我们可以按 \(a.first\) 的值的顺序来更新,这个时候对于位于 \(i\) 后面的 \(j\) 但是满足 \(b_j + 1 = b_i\) 这样的数可以用其 \(dp\) 值直接更新 \(dp_i\),于是得到了上面的转移方程。至于为什么第二关键字是倒序,这时因为对于 \(a.first\) 相等的数来说,它的原本的位置越靠前,越容易继承到第一关键字比它小但是第二关键字比它大的数的 \(dp\) 值。

考虑如何维护这个 \(max\),不难发现,处理到 \(i\) 的时候所有已经处理过的数都是第一关键字不大于 \(a_i.first\) 的数,于是分为三类,第一类是 \(a_j.first + 2 \le a_i.first\),这一类用树状数组维护最值(这里相当于将第二类情况延时处理了一轮),第二类是 \(a_j.first + 1 = a_i.first\),这一类比较第二关键字,第三类是 \(a_j.first = a_i.first\),这一类直接继承前一个数的 \(dp + 1\) 值,同时如果在某个 \(j\) 满足第二类时特别处理一下即可。

时间复杂度 \(O(n \log{n})\)

代码

解析二

这个做法来自于 \(peltorator\)(cf名),代码链接:https://codeforces.com/contest/2161/submission/346684700

这是本蒟蒻在比赛的评论区发现的大佬的解答orz,感觉很妙,在这里分享给各位佬。

考虑构造一个图,将所有的坏的 \(i\)\(j\) 对之间连一条边,那么这道题变为找这个图的最小点覆盖,注意到这个图是个二分图,因为点 \(i\) 仅和值为 \(b_i + 1\) 的点相连,所以由Kőnig定理,最小点覆盖等于最大边匹配,这个边匹配可以贪心的取:

先找 \(b_i\) 的值最小的 \(i\), 如果有一样小的就取 \(i\) 值最大的,如果它和点 \(j\) 连有边,那么一定有 \(b_j = b_i + 1\),我们在所有满足这个条件的 \(j\) 中选择 \(j\) 值最大的,然后将 \(i\)\(j\) 一同删去,重复这个过程。

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

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

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

相关文章

Linux 交叉编译(toolchain) ARM版 libc.so 库

前言全局说明编译 libc.so一、说明 环境: CentOS Linux 7 (Core) Kernel 3.10.0-1127.el7.x86_64 on an x86_64二、下载源码: 官网: http://ftp.gnu.org 源码下载: http://ftp.gnu.org/gnu/libc/ 历史版本: http://…

revit api事件

revit api事件DocumentOpened事件public class Application_DocumentOpened : IExternalApplication {public IExternalApplication.Result OnStartup(ControlledApplication application){try{//注册事件application.…

《我测了5个排版工具后,终于把时间还给了内容创作》

《我测了5个排版工具后,终于把时间还给了内容创作》每天在公众号后台调整行间距、寻找合适模板,跨平台发稿时反复复制粘贴,往往要耗费 1-2 小时 —— 作为经常处理排版工作的运营,我实际测试了 5 款编辑器,希望找…

EDKII工程结构介绍

EDK2工程结构介绍一 EDk2开发环境的安装目录一、EDK2工程目录的一级结构 二、常用的目录文件 2.1 BaseTools--构建工具链 2.2 Conf--配置目录 2.3 MdePkg--基础核心包 2.4 MdeModulePkg -- 常用模块包 2.5 OvmfPkg…

《程序员修炼之道:从小工到专家》读后感3

后半部分围绕“成长与协作”展开,描绘了从“合格程序员”到“专家型开发者”的进阶路径。这部分内容跳出了单纯的技术和工具层面,聚焦于职业格局、团队协作和持续成长,让我对“专家”的定义有了全新的认知:真正的专…

Vue3组件代码编写遵循1.0

优秀的Vue组件代码编写应该遵循以下标准:组件设计原则单一职责原则 (Single Responsibility Principle)每个组件只负责一个功能 保持组件的纯粹性和可复用性 避免组件过于臃肿开放封闭原则 (Open-Closed Principle)对…

《程序员修炼之道:从小工到专家》读后感2

中间部分将焦点转向“工具与方法”,为程序员提供了一套可落地的实践指南。如果说前半部分是思想层面的觉醒,这部分就是行动层面的赋能,让我学会运用科学的工具和流程,将“把事做好”的愿望转化为实实在在的能力,深…

《程序员修炼之道:从小工到专家》读后感1

前半部分聚焦“原则与态度”,为初入行业或陷入迷茫的程序员点亮了职业道路的第一盏灯。书中没有堆砌复杂的技术细节,而是从思维模式和工作习惯入手,剖析了成为优秀开发者的核心前提,让我对“程序员”的职业认知实现…

2025西南地区优质温室大棚厂家精选推荐:深度解析重庆青程技术实力!蔬菜大棚厂家推荐

在设施农业快速发展的当下,温室大棚的适配性、耐用性直接关系到种植户的生产效率与收益。为给中小种植户、家庭农场及初创农业项目提供实用参考,结合地域气候适配性、产品实用性、用户口碑等多维度,具优势的温室大棚…

通义灵码助力美图构建AI驱动研发体系,助力提升研发能效和流程智能化

美图公司是一家以 “让艺术与科技美好交汇”为使命的科技创新公司,致力于为用户提供多元化、高质量的美图产品和服务。公司拥有包括美图秀秀、美颜相机、美图设计室、美图云修等在内的多款知名应用。截至2025年6月30日…

2025修护/二硫化硒去屑/香氛/控油蓬松/ 洗发水推荐榜:MASIL 玛丝兰(悦己容)五星领跑!长效去屑 + 温和修护,3 牌凭特色突围​

随着 2025 年消费者对头皮护理的需求从 “短期去屑” 转向 “长效控油、温和修护、屏障保护”,二硫化硒去屑洗发水作为头屑问题的核心解决方案,愈发注重 “浓度科学适配、成分协同增效、场景化护理”。综合去屑长效性…

数列分块学习笔记(锣鼓梳理额粉筷入门模板)

数列分块入门1 我们预处理出每个点所在的区块,预处理每个区块的左端点和右端点。 对于添加操作,我们先判断是否在同一区间,如果是的话就在区间里面暴力重构。 如果不是,那么就对于一整块要处理的区间的左边神域和右…

2025凝汽器/换热器/空预器/板式换热器/管式换热器/空冷岛/电磁脉冲/胶球/热网加热器/低低温省煤器/清洗设备/服务推荐榜:郑州赛为机电五星领跑!在线清洗 + 定制化,3 企凭特色突围​

随着 2025 年核电、火电、化工等高能耗领域对 “清洗设备不停机运行、节能降耗、场景定制化” 需求深化,清洗设备已从 “传统离线清洗” 转向 “在线智能清洗、全工况适配”。综合技术创新性、工况适配度、服务覆盖及…

claude-ide搭建

claude-ide搭建 说明 官方:https://www.claudeide.net/zh 按照之前的搭建好Windows的node.js环境。 步骤 安装 # 安装 Node.js 18+, 然后运行: npm install -g @anthropic-ai/claude-code配置 # cmd控制台设置 set AN…

MySQL性能分析(四)之processlist详解

一、概述 进程列表表(information_schema.processlist表或SHOW PROCESSLIST命令)是MySQL的核心表之一,用于查看MySQL当前所有的连接进程,帮助管理员监控数据库活动并排查性能问题。 进程列表表是进程信息的来源之一I…

2025年5310/6479/高压合金管厂家推荐榜:天津大无缝联合钢铁五星领跑!多材质适配 + 工业攻坚,3 企凭高端 / 特种 / 大口径显优势​

随着 2025 年化工反应釜、电站锅炉、高端机械等领域对 “合金管耐高温、抗高压、耐腐蚀” 需求升级,产品逐渐从 “通用型” 转向 “场景化材质定制、极端工况适配”。综合材质多样性、性能稳定性、工业适配度及用户口…

类命名空间中“同名成员的覆盖规则”和“属性查找时的递归陷阱”

class Student:score = 100 # 类属性(与方法同名)def score(self): # 方法(与类属性同名)return self.score # 这里的score 指的是score方法吗?是不是因为score方法把类属性score覆盖了?# 访问类属性: prin…

2025年旋转接头标杆厂家最新推荐:多通路旋转接头/水用旋转接头/回转旋转接头/H型旋转接头/液压旋转接头/旭康机械,定义工程机械与工业传热领域可靠性新标准

随着工业自动化程度不断深化及设备精密性要求持续提高,作为关键基础零部件的旋转接头,其性能稳定性、密封可靠性及使用寿命已成为影响整个设备系统运行效率的核心因素。2025年,旋转接头市场在工程机械、橡塑、化工、…

mysql主从配置(保姆级) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

打开浏览器

1、打开浏览器,然后在cmd中输入adb shell dumpsys activity | findstr "mResumedActivity" 命令 根据输出内容得到浏览器包名为 com.huawei.browser 2、代码上连接上手机并打开浏览器 from airtest.core.ap…