Pinely Round 5 (Div.1 + Div.2)

news/2025/10/31 14:30:49/文章来源:https://www.cnblogs.com/663B/p/19179749

A - E 题解。

A

考虑 \(R\) 一定是越小越好,这样可以尽可能让 Div.2 也 Rated,于是每次 Rated Round 都有 \(R \gets \max(0, R - D)\)。模拟即可。

B

神人 b 题。YES 只有两种可能:黑格可补成一个 \(2\times 2\) 的正方形,或者黑格可以补成一条折线,比如这样:

.##...
..##..
...##.
....##

分别判断,\(\mathcal O(n^3)\) 模拟即可。
注意到还有一种刻画方法:黑格 \(x-y\) 的极差 \(\le 1\) 或者 \(x+y\) 的极差 \(\le 1\)​。队友赛后给我讲了这个东西,但我没有尝试。

#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec secondusing pii = std::pair<int, int>;std::pair<int, int> up = {-1, 0}, dn = {1, 0}, lef = {0, -1}, rig = {0, 1};void work() {int n;std::cin >> n;std::vector<std::string> s(n);int tot = 0;for (int i = 0; i < n; ++i) {std::cin >> s[i];}bool ok = true;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (s[i][j] == '#') {++tot;}}}if (n <= 2) return std::cout << "YES\n", void();for (int i = 0; i < n - 1; ++i) {for (int j = 0; j < n - 1; ++j) {int c = 0;for (int dx = 0; dx < 2; ++dx) {for (int dy = 0; dy < 2; ++dy) {c += s[i + dx][j + dy] == '#';}}if (c == tot) {return std::cout << "YES\n", void();}}}for (int x = 0; x < n; ++x) {for (int y = 0; y < n; ++y) {bool tmp = false;auto chk = [&](int x, int y, pii del1, pii del2) -> bool {int cur = 0;do {cur += s[x][y] == '#';x += del1.fir, y += del1.sec;std::swap(del1, del2);} while (0 <= x && x < n && 0 <= y && y < n);return cur == tot;};for (auto ud : {up, dn}) {for (auto lr : {lef, rig}) {tmp |= chk(x, y, ud, lr);tmp |= chk(x, y, lr, ud);}}if (tmp) return std::cout << "YES\n", void();}}std::cout << "NO\n";return;
}int main() {std::cin.tie(nullptr)->sync_with_stdio(false);int t;std::cin >> t;while (t--) work();return 0;
}

C

Key observation: 可以获得 bonus point 的次数一定,为 \(\lfloor \frac{\sum a_i}{X} \rfloor\)

那么我们希望构造一组解,满足答案是前 \(\lfloor\frac{\sum a_i}{X} \rfloor\) 大。

考虑这样一个 idea:用较小的 \(a_i\) 垫,用最大的 \(a_i\) 完成收割。

\(a_i\) 升序排序,双指针,若 \(S + a_r\ge X\),那么取得一个 bonus point,\(S\gets (S+a_r)-X,r\gets r-1\)

反之用 \(a_l\) 垫,\(S\gets S+a_l, l\gets l+1\)

#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec secondvoid work() {int n, X;std::cin >> n >> X;std::vector<int> a(n);for (auto& x : a) std::cin >> x;std::sort(a.begin(), a.end());long long ans = 0;int S = 0;int l = 0, r = n - 1;std::vector<int> wt;while (l <= r) {if (S + a[r] >= X) {(S += a[r]) -= X;wt.pb(a[r]);ans += a[r--];} else {wt.pb(a[l]);S += a[l++];}}std::cout << ans << '\n';for (auto& x : wt) std::cout << x << ' ';std::cout << '\n';return;
}int main() {std::cin.tie(nullptr)->sync_with_stdio(false);int t;std::cin >> t;while (t--) work();return 0;
}

D

Key observation: 假设 \(x\) 在序列中的出现位置为 \(y_1,y_2,\dots y_m\),那么最优方案里,要么不留 \(x\),要么留下连续的一段 \(y_{[l,r]}\)

证明很好理解,考虑如果你选上了 \(y_l, y_r\),那么 \(y_r\)\(x-1\) 造成的影响最大,\(y_l\)\(x+1\) 造成的影响最大,\(y_{(l, r)}\) 这一部分不选白不选。

那么考虑对值域 dp。设 \(f_{i, j}\) 表示值为 \(i\) 的数里,留下的最靠前的一个为 \(a_j\) 的最大贡献,\(g_{i, j}\) 表示值为 \(i\) 的数里,留下的最靠后的一个为 \(a_k\) 的最大贡献。若 \(j=n+1\) 表示没选 \(i\)

这个状态可能会让人觉得很怪,其实只是我想形式化一点地描述 "贡献延后计算" 的过程,我自己思考的时候只定义了 \(f\)

考虑转移,\(g_{i, j} = \max\limits_{k>j} (f_{i-1,k}+1), f_{i,j} = \max\limits_{k\ge j} (g_{i, k} + [[j, k)\ \mathrm{间}\ i \ \mathrm{出现的次数}])\)。其中蕴含了贡献延后计算的思想。

考虑开 \(n\) 个 vector 维护每个值 \(i\) 出现的位置。这样 \(f_{i, *}\) 的转移是简单的,我们考虑如何维护 \(g_{i, *}\) 的转移。

首先这是一个后缀 max 的形式,使用树状数组可以 \(\mathcal O(n\log n)\) 地维护。

但我们还可以做得更好!考虑双指针,两个指针分别倒着扫 \(i,i-1\) 出现的位置,对 \(i-1\) 那个指针维护一个后缀 max 即可。时间复杂度 \(\mathcal O(n)\)。考场上我写了树状数组的 \(\mathcal O(n\log n)\) 做法。

#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec secondconstexpr int maxn = 3e5 + 5;
int c[maxn], n, a[maxn];
std::vector<int> pos[maxn];int lowbit(int x) {return x & -x;
}
std::vector<int> stk;
void add(int x, int y) {for (; x; x -= x & -x) {stk.pb(x);c[x] = std::max(c[x], y);}return;
}
int query(int x) {int ans = 0;for (; x <= n + 1; x += x & -x) {ans = std::max(ans, c[x]);}return ans;
}void work() {std::cin >> n;for (int i = 1; i <= n + 1; ++i) {pos[i].clear();a[i] = c[i] = 0;}stk.clear();for (int i = 1; i <= n; ++i) {std::cin >> a[i];pos[a[i]].pb(i);}std::vector<int> ans(n + 1, 0);for (int i = 1; i <= n; ++i) {std::reverse(pos[i].begin(), pos[i].end());std::vector<std::pair<int, int>> mdf(pos[i].size());int cur = -1e9;ans[i] = query(1);for (int j = 0; j < pos[i].size(); ++j) {cur = std::max(cur, query(pos[i][j] + 1) - j);mdf[j] = {pos[i][j], cur + j + 1};ans[i] = std::max(ans[i], cur + j + 1);}for (auto& x : stk) {if (x <= n) c[x] = 0;}stk.clear();add(n + 1, ans[i - 1]);for (auto& [x, y] : mdf) add(x, y);}std::cout << n - std::max(ans[n], query(n + 1)) << '\n';return;
}int main() {std::cin.tie(nullptr)->sync_with_stdio(false);int t;std::cin >> t;while (t--) work();return 0;
}

E

不妨设 \(0\) 开头,\(1\) 开头类似。

考虑合法的 \(s\) 的形态,乱玩几组样例可以发现,这道题的关键在于 \(01\) 交替的那个位置。

假设 \(s_{[1, x]} = 0, s_{x+1} = 1\),那么 \(x\) 开头的这个区间,必然是 \(0\) 出现了 \(\frac{k+1}2\) 次,\(1\) 出现了 \(\frac{k-1}2\) 次。并且 \([x+1,n]\) 会形成一个长度为 \(k-1\) 的循环节。

有点懒得证明,而且感觉不好证明,自己手摸一下就感受出来了(

考虑如何处理,根据循环节和输出的 \(s\) 的限制,预处理 \(s_i\) 可否为 \(0,1\),分为三类:

  • \(s_i\) 只可取 \(0\)
  • \(s_i\) 只可取 \(1\)
  • \(s_i\) 可取 \(0,1\)

枚举上文中的 \(x\),发现我们其实就是要求出 \(s_{[x+1,x+k-1]}\)\(0,1\) 出现次数均为 \(\frac{k-1}2\) 的方案数。

筛掉那些已经固定的 \(s_i\),用组合数求出其余 \(s_i\) 的取值方案即可。

还有一种可能,直到最后一个区间都是 \(0\) 开头,和上面的问题类似,特判一下即可。时间复杂度 \(\mathcal O(n)\)

#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec secondusing i64 = long long;
using pii = std::pair<int, int>;constexpr int mod = 998244353;void add(int& x, int y) { if ((x += y) >= mod) x -= mod; return; }
void sub(int& x, int y) { if ((x -= y) < 0) x += mod; return; }namespace binomial {std::vector<int> fac, ifac, inv;void init(int n) {fac.resize(n + 5, 0), ifac.resize(n + 5, 0), inv.resize(n + 5, 0);fac[0] = fac[1] = ifac[0] = ifac[1] = inv[1] = 1;for (int i = 2; i <= n; ++i) {fac[i] = 1ll * fac[i - 1] * i % mod;inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;ifac[i] = 1ll * ifac[i - 1] * inv[i] % mod;}return;}int C(int n, int m) {if (n < 0 || m < 0 || n < m) return 0;return 1ll * fac[n] * ifac[n - m] % mod * ifac[m] % mod;}
}using namespace binomial;void work() {int n, k;std::cin >> n >> k;std::string s;std::cin >> s;binomial::init(n);std::vector<std::vector<bool>> div(n, std::vector<bool>(2, false));for (int i = n - 1; ~i; --i) {for (int j = 0; j < 2; ++j) {div[i][j] = (s[i] == '0' + j) || (s[i] == '?');if (i + k - 1 < n) div[i][j] = div[i][j] & div[i + k - 1][j];}}std::vector<std::vector<int>> sum(n + 1, std::vector<int>(4, 0));for (int i = n - 1; ~i; --i) {++sum[i][div[i][0] + 2 * div[i][1]];for (int j = 0; j < 4; ++j)sum[i][j] += sum[i + 1][j];}int ans = 0;for (int op = 0; op < 2; ++op) {for (int i = 0; i < n; ++i) {if (s[i] == '0' + (op ^ 1)) break;if (i + 1 + k - 1 >= n) {for (int tar = 0; tar <= k; ++tar) {if (tar <= k - tar) continue;if (sum[i + 1][0]) break;int A = tar - sum[i + 1][op + 1], B = k - tar - sum[i + 1][(op ^ 1) + 1];--A;if (A < 0 || B < 0) continue;add(ans, binomial::C(A + B, A));}  break;}if (sum[i + 1][0] - sum[i + k][0] > 0) continue;int tar = (k - 1) / 2, A = tar - (sum[i + 1][(op ^ 1) + 1] - sum[i + k][(op ^ 1) + 1]),B = tar - (sum[i + 1][op + 1] - sum[i + k][op + 1]);if (s[i + 1] == '?' && div[i + 1][0] && div[i + 1][1]) --A;if (!div[i + 1][op ^ 1]) continue;if (A < 0 || B < 0) continue;add(ans, binomial::C(A + B, A));}}std::cout << ans << '\n';return;
}int main() {std::cin.tie(nullptr)->sync_with_stdio(false);int t;std::cin >> t;while (t--) work();return 0;
}

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

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

相关文章

2025年建筑钢模板生产厂家权威推荐榜单:建筑新型模板/建筑圆柱模板/木模板建筑源头厂家精选

在建筑行业高速发展的今天,钢模板作为混凝土浇筑过程中不可或缺的施工工具,其质量直接关系到工程的安全、成本和进度。全球钢模板市场规模在2024年已达到约327亿元,预计到2031年将增长至接近499亿元,年复合增长率达…

2025年ai自助建站公司权威推荐榜单:ai快速建站/ai建站工具/ai云建站源头公司精选

在数字化转型加速的2025年,企业官网已从单纯的信息展示窗口升级为“智能获客与品牌增长”的核心引擎。据行业数据显示,全球企业在AI建站工具上的投入同比增长37%以上,其中集成智能交互与自动化运维的平台成为市场新…

2025 年升降平台源头厂家最新推荐排行榜:专利加持、ISO 认证的 TOP5 品质之选,含协会测评权威数据铝合金/装卸平台/高空作业升降平台公司推荐

引言 为解决升降平台采购者选品难题,重型机械工业协会升降作业平台分会联合第三方检测机构,开展 2025 年度行业测评并发布最新推荐排行榜。本次测评覆盖全国 120 余家源头厂家,采用 “资质审核 + 性能检测 + 用户口…

蓝牙体重秤方案:硬件设计需要注意什么

蓝牙体重秤的硬件设计直接影响测量精度、蓝牙通信稳定性和续航能力,需重点关注以下核心要点:一、传感器与称重电路设计传感器选型与布局采用4片电阻应变片组成的桥式传感器(平行梁结构为主),确保线性度(误差≤0.…

【新特性】 版本速递 | 华为云Versatile智能体平台 新增特性介绍(2025年10月发布)

本文分享自华为云社区《【新特性】 版本速递 | 华为云Versatile智能体平台 新增特性介绍(2025年10月发布)》,作者:Versatile运营小助手。 华为云Versatile智能体平台 体验入口>>>华为开发者空间--开发平台…

电子体重秤方案开发用sic8632

在电子体重秤开发中采用SIC8632芯片,能带来多方面的优势,尤其契合电子体重秤对精度、功耗、成本及功能集成的核心需求,具体如下:高精度测量能力SIC8632内置24位高分辨率差分ADC(模数转换器),并搭配可编程增益放…

2025年10月绩效管理咨询公司推荐:实力榜评价

“我们想把战略真正落到员工每一天的绩效里,而不是纸上谈兵。”——这是近一年里制造业、互联网、医药、消费连锁等行业HRD在选型时最常说的一句话。背后折射的痛点高度相似:战略解码难、指标与激励脱节、数据口径乱…

2025 年升降机厂家企业最新推荐排行榜:包含液压升降机、导轨式升降机等多品类,为企业与消费者甄选优质品牌汽车/移动式/提升机/登车桥公司推荐

引言 随着升降机行业快速发展,市场上产品数量激增,但质量差异显著,给采购者带来极大困扰。部分厂家为压缩成本,降低原材料标准、简化生产流程,导致设备存在安全隐患,难以满足高空作业与货物运输的安全要求;同时…

使用JMH对远程接口进行压测

在 《java中的基准测试框架JMH》中我们使用JMH框架进行Java SDK中的API的压测。 最近我又遇到了需要对第三方接口进行压测的需求,又用到了它。JHM(Java Microbenchmark Harness)是OpenJDK团队开发的Java微基准测试框…

基础排序算法(五)直接插入排序

基础排序算法(五)直接插入排序一 直接插入排序 直接插入排序是一种非常直观且基础的排序算法,其核心思想类似于我们整理扑克牌。 1.1 特性总结 1.2 算法原理 1.3 复杂度分析 1.4 使用场景 1.5 代码实现 1.6 常用算法…

跟客宝 SCRM 微信小程序系统:一站式客户管理与销售赋能解决方案

一、概述总结 跟客宝 SCRM 是一款基于微擎系统交付的微信小程序客户关系管理工具,聚焦销售全流程数字化管理。系统支持 PHP7.2 至 PHP8.0 多版本环境,提供源码未加密的官方正品保障,以灵活的服务套餐满足企业客户管…

霸屏小店小程序系统:全场景电商裂变解决方案

霸屏小店是一款基于微擎平台的多端电商系统,支持微信公众号、微信小程序、PC、字节跳动小程序等多终端部署,以 “三网霸屏 + 无限裂变” 为核心,整合实物带货、虚拟产品售卖、优惠券营销等多元功能,为商家提供从产…

关于 plt.legend() 中 bbox_to_anchor 的理解

在 matplotlib 中,bbox_to_anchor 是用于调整图例(legend)、文本(text)等元素位置的重要参数,它的作用是指定元素的 “锚点框”(bounding box)相对于参考坐标系的位置。 参数形式 bbox_to_anchor 通常接收一个…

网上售楼处小程序系统:全场景数字化营销解决方案

一、概述总结 网上售楼处小程序系统是一款适配微信平台的数字化营销工具,提供源码下载与定制开发服务,聚焦房产行业线上获客与交易转化需求。系统依托微擎开放平台的技术支撑,整合营销推广、客户管理、交易辅助等核…

给旧版 .NET 也开一扇“私有之门”——ILAccess.Fody 实现原理与设计

给旧版 .NET 也开一扇"私有之门" —— ILAccess.Fody 实现原理与设计 作者:huoshan12345 项目地址:ILAccess.Fody前言:从 UnsafeAccessor 说起 在 .NET 8 中, 微软引入了一个让底层开发者非常心动的新特性…

当Dify遇见Selenium:可视化编排UI自动化测试,原来如此简单

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 在UI自动化测试领域,Selenium一直是无可争议的王者,但其陡峭的学习曲线和复杂的代码维护成本让许多测试团队望而却步。而今,通过Dify的可…

Playwright与Selenium的对比

明白了!既然你有 Python 和 Selenium 的基础,那学习 Playwright 会非常快。我们来用你熟悉的视角来讲解。Playwright vs Selenium:程序员视角 把它们都看作是 "浏览器遥控器",但 Playwright 是新一代的、…

MLGO微算法科技发布多用户协同推理批处理优化系统,重构AI推理服务效率与能耗新标准

在人工智能(AI)与移动计算深度融合的背景下,边缘计算逐步成为新一代智能服务基础架构的核心。在这一浪潮中,微算法科技(NASDAQ:MLGO)推出一种具有批处理功能的边缘服务器实现多用户协同推理技术,这项技术不仅提…

2025 年 HDPE 土工膜,聚乙烯土工膜,糙面土工膜厂家最新推荐,产能、专利、环保三维数据透视!

引言 在基建与环保工程需求激增的背景下,HDPE、聚乙烯、糙面土工膜的市场规模持续扩大,但产品质量差异显著,行业抽检显示仅有 68% 的产品核心指标达标。为破解采购困境,本次推荐依托土工合成材料工程协会 2025 年度…

2025年汽油发电机生产厂家权威推荐榜单:静音发电机/施工发电机/高原发电机源头厂家精选

根据QYR(QYResearch)的统计及预测,2024年全球汽油发电机市场销售额已达到9.71亿美元,预计到2031年将增长至13.42亿美元,期间年复合增长率(CAGR)为4.8%。全球市场目前呈现高度集中态势,前三大厂商合计占据超过3…