CF2165 VP 记录

news/2025/11/20 20:47:53/文章来源:https://www.cnblogs.com/Ydoc770/p/19236521

A

贪心,注意到从小到大合并,每次选择代价少的最优,因为生成的新数等于代价. 在此基础上模拟即可,可以使用链表实现. 我用的链表 + 并查集,感觉怪怪的.

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn = 2e5 + 10;
int T, n, a[maxn];
int p[maxn], l[maxn], r[maxn];int fa[maxn];
int fd(int u) {return u == fa[u] ? u : fa[u] = fd(fa[u]);}
void merge(int u, int v) {u = fd(u), v = fd(v);if(u != v) {if(a[u] < a[v]) swap(u, v);fa[v] = u;}
}
inline bool cmp(int x, int y) {return a[x] < a[y];}void solve(){ll ans = 0;cin >> n; for(int i = 1; i <= n; i++) cin >> a[i], p[i] = i, l[i] = i - 1, r[i] = i + 1;l[1] = n, r[n] = 1; sort(p + 1, p + n + 1, cmp);for(int i = 1; i <= n; i++) fa[i] = i;for(int i = 1; i < n; i++) {int L = fd(l[p[i]]), R = fd(r[p[i]]), nw = fd(p[i]);if(max(a[L], a[nw]) < max(a[R], a[nw])) ans += max(a[L], a[nw]), merge(L, nw), r[L] = r[nw], l[nw] = l[L];else ans += max(a[R], a[nw]), merge(R, nw), l[R] = l[nw], r[nw] = r[R];} cout << ans << "\n";
}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> T; while(T--) solve();return 0;
} 

B

众数的限制难以刻画,正难则反.

考虑对于一个生成的多重集合 \(S\) 来判断是否合法,我们发现 \(S\) 中未出现的数 \(x\),即在任意一个划分出来的多重集合中为非众数的,满足限制:

\[\max \limits_{x\notin S}\{cnt_x\}\le\sum_{y\in S}cnt_y \]

这个条件是充要的. 考虑限制最严格的时候是 \(cnt_x\)\(x\) 在同一个划分出来的多重集合里面,那么至少有上述限制.

考虑根据限制设计 DP,发现是否在多重集合里面选这个数就是 \(0/1\) 背包. 设 \(f_j\) 表示选的 \(\sum cnt_y=j\) 时的方案数. 选一个数后,必然可以通过调整(比如每个数划分一个多重集合)凑出所有 \(1\sim cnt_y\) 个出现在生成的多重集合中的情形,所以有转移(倒序枚举 \(j\)):

\[f_j\leftarrow f_j+cnt_y\times f_{j-cnt_y} \]

最后的答案即:

\[ans=\sum_{i=\max \limits_{x\notin S}\{cnt_x\}}^nf_i \]

点击查看代码
#include<bits/stdc++.h>
using namespace std;const int maxn = 5e3 + 10, mo = 998244353;
int T, n, a[maxn];
int cnt[maxn], f[maxn];inline int add(const int &x, const int &y) {return x + y >= mo ? x + y - mo : x + y < 0 ? x + y + mo : x + y;}
inline void upd(int &x, const int &y) {x = add(x, y);}void solve() {int mxc = 0, ans = 0; memset(cnt, 0, sizeof cnt);cin >> n; for(int i = 1; i <= n; i++) cin >> a[i], mxc = max(mxc, ++cnt[a[i]]);memset(f, 0, sizeof f); f[0] = 1;for(int i = 1; i <= n; i++) if(cnt[i]) {for(int j = n; j >= cnt[i]; j--) upd(f[j], 1ll * cnt[i] * f[j - cnt[i]] % mo);}for(int i = mxc; i <= n; i++) upd(ans, f[i]);cout << ans << "\n";
}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> T; while(T--) solve();return 0;
}

C

贪心,思路是明确的,考场上有一些细节没想清楚.

拆位,从高位到低位考虑,若当前存在 \(a_{i,t}\ge c_t\) 则不需要操作,否则找到最大的 \(a_i\) 改成 \(2^t\). 发现这个操作至多进行 \(O(\log V)\) 次,即我们只需要拿出最大的 \(O(\log V)\)\(a_i\) 来进行上述操作,每次做完一位把 \(a_i\) 这一位去掉即可.

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn = 5e5 + 10;
int T, n, q, a[maxn], tmp[40];void solve() {cin >> n >> q; for(int i = 1; i <= n; i++) cin >> a[i];sort(a + 1, a + n + 1); reverse(a + 1, a + n + 1); int lim = min(n, 31);for(int i = 1; i <= q; i++) {int c; ll ans = 0 ; cin >> c;for(int i = 1; i <= lim; i++) tmp[i] = a[i];for(int t = 30; t >= 0; t--) {int cnt = 0;for(int i = 1; i <= lim; i++) cnt += (tmp[i] >> t & 1);if(cnt > (c >> t & 1)) break;if(cnt < (c >> t & 1)) {int id = 1; for(int i = 2; i <= lim; i++) if(tmp[i] > tmp[id]) id = i;ans += (1 << t) - tmp[id], tmp[id] = 0;//补位之后对后面的位无贡献 }else for(int i = 1; i <= lim; i++) tmp[i] &= (1 << t) - 1;} cout << ans << "\n";}return;
}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> T; while(T--) solve();return 0;
}

D

有点神奇的贪心.

考虑把划分成最少的子序列转换为进行最多次形如序列中左右两个相差为 \(1\) 的数的匹配. 每个数仅能与左边和右边各一个数匹配. 一个贪心策略是,如果我们每次找当前位置右边的数来匹配,那么从右往左匹配最优. 即我们希望剩下没匹配的数尽量靠左,这样限制更加宽松. 可以用 set 维护,非常好写,时间复杂度 \(O(n\log n)\). 精细实现可以做到 \(O(n)\).

点击查看代码
#include<bits/stdc++.h>
using namespace std;const int maxn = 1e6 + 10;
int T, n;vector<int> pos[maxn << 1];
set<int> s[maxn << 1];void reinit() {for(int i = 1; i <= 2 * n; i++) s[i].clear();for(int i = 1; i <= 2 * n; i++) pos[i].clear();
}void solve() {cin >> n; int ans = n;for(int i = 1; i <= n; i++) {int x; cin >> x, pos[x].push_back(i), s[x].insert(i);}for(int i = 1; i <= 2 * n; i++) {reverse(pos[i].begin(), pos[i].end());for(int x : pos[i]) {auto p = s[i - 1].lower_bound(x);if(p != s[i - 1].end()) {ans--, s[i - 1].erase(p);}else {p = s[i + 1].lower_bound(x);if(p != s[i + 1].end()) {ans--, s[i + 1].erase(p);}}}} cout << ans << "\n";reinit();
}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> T; while(T--) solve();return 0;
} 

E

鬼题.

F

非常巧妙的思维题.

首先将数区间转换成对每个 \(p_2\) 找到最小的 \(p_5\). 限制无法直接做,不妨拆成两部分 \(21\)\(435\). 一旦我们找到了所有的这样的两种子序列,拼起来的限制是 \(v_3>v_2,p_4>p_1\),于是可以做二维偏序来求解.

第一部分是简单的,可以用单调栈维护下降子序列来求得左边第一个大于 \(v_1\) 的位置. 第二部分相对大小关系非常神秘,一个非常非常厉害的观察是,最小的 \(p_5\) 一定是右边第一个大于 \(v_3\) 的数. 考虑分讨:

0cf36d8c5e3c93c6c85a8ac91ef191898bf411ac

  • 若存在 \(p_5<p_5'\) 且有 \(v_5>v_5'>v_4\)\(p_5\) 更优.
  • 若存在 \(p_5<p_5'\) 且有 \(v_5'>v_5>v_4\),选择 \(p_5\) 不劣.
  • 若存在 \(p_5<p_5'\) 且有 \(v_5'>v_4>v_5\),可以把 \(p_3\) 换到 \(p_5\) 处,仍然合法.

所以同样用一个单调栈求出 \((p_3,p_5)\)\(p_4\) 可以用扫描线+线段树二分实现.

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

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

相关文章

如何在SPM混编中实现不同target之间的通信?

在 SPM 混编场景中,不同 target 之间的通信核心是通过 “模块依赖 + 公开接口” 实现跨语言 / 跨模块调用—— 因为 SPM 的核心限制是 “单个 target 不能混放 Swift 与 C 系语言(OC/C、C++)”,所以拆分后的多 tar…

Python在线教育广告精准投放:SEM结构方程、XGBoost、KDE核密度、聚类、因子分析、随机森林集成优化融合用户满意度渠道效能|附代码数据

全文链接:https://tecdat.cn/?p=44299 原文出处:拓端数据部落公众号分析师:Jian Huang在数字经济纵深发展的今天,在线广告已成为在线教育行业触达用户、实现商业转化的核心载体,但行业普遍面临“流量昂贵却转化低…

完整教程:Spring Boot Actuator全解析

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

专题:2025年AI Agent智能体行业价值及应用分析报告:技术落地与风险治理|附140+ 份报告PDF、数据、可视化模板汇总下载

原文链接:https://tecdat.cn/?p=44322原文出处:拓端抖音号@拓端tecdat引言 2024年,AI智能体终于从实验室走进企业车间、客服中心和财务部门——金融机构用它优化风控流程,医药零售靠它解答用药疑问,工业企业尝试…

专题:2025构建全自动驾驶汽车生态系统:中国智能驾驶行业全景研究报告|附80+份报告PDF、数据仪表盘汇总下载

原文链接:https://tecdat.cn/?p=44316原文出处:拓端抖音号@拓端tecdat2025年,智能驾驶正站在“技术落地”与“规模商业化”的十字路口——自主品牌城市NOA渗透率已达9.1%,15万级车型标配激光雷达成为常态,但深圳…

2025/11/20-Why brushing teeth twice a day is not always best

2025/11/20-Why brushing teeth twice a day is not always bestWhy brushing teeth twice a day is not always best p { line-height: 1.5 } From LearnAndRecordWe all think we know how to brush our teeth - a s…

uos安装idea

uos安装idea1、下载ideaIU-2025.2.4-aarch64.tar.gz,可用最新版本。 网址:https://www.jetbrains.com/idea/download/download-thanks.html?platform=linuxARM64 2、操作系统更新 命令:sudo apt update 命令:apt …

HDU3586-Information Disturbing

HDU3586-Information Disturbing 题目大意 给你一棵树,你可以花费 \(w_i\) 去切断一条边。你的目标是切断每个叶子节点到根节点 \(1\) 的联系。要求在切断的总花费不大于 \(m\) 的条件下,最小化切断边的花费 \(w\) 的…

【App Service】.NET 应用在App Service上内存无法占用100%的问题原因

问题描述 如果使用Azure App Service部署.NET 应用,会发现在内容并没有达到100%的时候,也会出现OOM错误。这是一个什么情况呢?大内存测试代码static void Main(string[] args){Console.WriteLine("Hello, Worl…

深入解析:css 的 clip-path 属性,绘制气泡

深入解析:css 的 clip-path 属性,绘制气泡2025-11-20 20:30 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

快速构建一个基础、现代化的 WinForm 管理系统!

前言 前段时间有小伙伴在后台留言问:有没有好用的 WinForm 管理系统?今天大姚给大家分享一个基于 AntdUI 构建的 WinForm 管理系统,不需要我们写一行代码既能快速构建一个基础、现代化的 WinForm 管理系统。 项目介…

国内外研究现状全面解析:掌握学术前沿的必备指南

本文围绕学术研究中了解国内外研究现状展开,强调其是开展高质量研究的关键。图灵论文 AI 写作助手可免费选题、构思大纲、生成论文等,提升梳理分析效率。文中指出研究现状解析能避免重复研究、找准切入点。还给出实用…

费马小定理在素数检测中的应用

因为还没用过liux的编译环境,我这两天便寻思着在Windows上搭建一个scheme的编译环境。查阅了各路大神的搭建方式,最终选择在VSC上进行编译,不过整了两天只能说勉强能用。只有编译功能,无法debug也没有调试,而且最…

把 1688 商品详情「搬进 MySQL」:Java 爬虫全链路实战(2025 版) - 实践

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

深入解析:从传统架构到云原生,如何应对数据增长挑战?

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

50036_基于微信小程序的智能点餐推荐系统

1.项目包含 项目源码、项目文档、数据库脚本、软件工具等资料; 带你从零开始部署运行本套系统。 2.项目介绍 本文设计并实现了一个外卖点餐小程序,融合了传统的餐饮外卖管理与计算机技术,实现外卖业务的高效科学管理…

【NAOI】题解

【NAOI】真的是签到题吗 背景 OI不能没有签到题,就像 \(309\) 不能没有数据删除! 题目描述 有 \(T\) 组询问,每组问题如下: 是否存在 \(3\) 个长度为 \(n\) 的 \([0,n)\) 的排列 \(a,b,c\),使得 \(a_i+b_i=c_i\mod…

Windows系统基础安全浅谈

依照中华人民共和国安全法任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安…

深入解析:医疗多模态共情推理与学习一体化网络Python实现(2025扩充版)

深入解析:医疗多模态共情推理与学习一体化网络Python实现(2025扩充版)2025-11-20 20:14 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: a…

curl/libcurl SMTP CRLF注入漏洞深度分析

本文详细分析了curl/libcurl中存在的SMTP CRLF注入漏洞,攻击者可通过在MAIL FROM/RCPT TO参数中插入CRLF字符注入任意SMTP命令,导致未授权邮件拦截、信息泄露等严重安全问题。SMTP CRLF Injection in curl/libcurl v…