VP Educational Codeforces Round 30

news/2025/3/11 6:20:52/文章来源:https://www.cnblogs.com/maburb/p/18764079

A. Chores

点击查看代码
void solve() {int n, k, x;std::cin >> n >> k >> x;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}int ans = k * x;for (int i = 0; i < n - k; ++ i) {ans += a[i];}std::cout << ans << "\n";
}

B. Balanced Substring

题意:求一个\(01\)串最长的\(0\)\(1\)个数相同的子串。

\(1\)的位置加一,\(0\)的位置减一,记录相同的前缀和。

点击查看代码
void solve() {int n;std::cin >> n;std::string s;std::cin >> s;std::vector<int> sum(n + 1);for (int i = 0; i < n; ++ i) {sum[i + 1] = sum[i] + (s[i] == '1' ? 1 : -1);}std::map<int, int> mp;int ans = 0;mp[0] = 0;for (int i = 1; i <= n; ++ i) {if (mp.count(sum[i])) {ans = std::max(ans, i - mp[sum[i]]);} else {mp[sum[i]] = i;}}std::cout << ans << "\n";
}

C. Strange Game On Matrix

题意:每一列删去最顶上的若干个一,然后从剩下的最高的一往下数最多\(k\)个,使得和最大已经修改的数最少。

模拟题,每一列搞个前缀和,然后枚举选中的第一个一。

点击查看代码
void solve() {int n, m, k;std::cin >> n >> m >> k;std::vector a(n + 1, std::vector<int>(m + 1));std::vector sum(n + 1, std::vector<int>(m + 1));for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= m; ++ j) {std::cin >> a[i][j];sum[i][j] = sum[i - 1][j] + a[i][j];}}int ans = 0, cnt = 0;for (int j = 1; j <= m; ++ j) {int max = 0, del = 0;for (int i = 1; i <= n; ++ i) {if (a[i][j] == 1) {int x = std::min(n, i + k - 1);if (sum[x][j] - sum[i - 1][j] > max) {max = sum[x][j] - sum[i - 1][j];del = sum[i - 1][j];}}}ans += max;cnt += del;}std::cout << ans << " " << cnt << "\n";
}

D. Merge Sort

题意:对于归并排序,如果当前区间已经有序则返回,否则递归左右子区间。构造一个排列使得调用函数的总次数为\(k\)

次数总为奇数,因为最开始调用了一次,然后如果要继续递归则两个子区间都会调用一次。
那么我们可以交换\(mid - 1, mid\)这两个位置,这样左右区间依然有序,并且当前区间无序,就可以向下递归。

点击查看代码
void solve() {int n, k;std::cin >> n >> k;std::vector<int> a(n);std::iota(a.begin(), a.end(), 1);auto dfs = [&](auto & self, int l, int r) -> void {if (l + 1 == r || k == 0) {return;}k -= 2;int mid = l + r >> 1;std::swap(a[mid - 1], a[mid]);self(self, l, mid);self(self, mid, r);};	k -= 1;dfs(dfs, 0, n);if (k == 0) {for (int i = 0; i < n; ++ i) {std::cout << a[i] << " \n"[i == n - 1];}} else {std::cout << -1 << "\n";}
}

E. Awards For Contestants

题意:数组从大到小排序后,把区间分成\(4\)段,第\(4\)段长度可以为\(0\)。要求前三段的长度都互相不超过另外两段的两倍,同时要求第一段最小值减第二段最大值最大,满足上面条件还要第二段最小值减第三段最大值最大,同时要求第三段最小值减第四段最大值最大。

可以枚举前两段,那么第三段可以取的区间范围也可以算出来。然后第三段的结尾我们肯定要减下一个数最大的位置,可以用线段树维护。
注意如果第四段为空,则第三段减第四段的值等于第三段的最小值。

点击查看代码
#define ls (u << 1)
#define rs (u << 1 | 1)
#define umid (tr[u].l + tr[u].r >> 1)template <class Info>
struct Node {int l, r;Info info;
};template <class Info>
struct SegmentTree {std::vector<Node<Info> > tr;SegmentTree(int _n) {init(_n);}SegmentTree(std::vector<Info> & a) {init(a);}void init(int _n) {tr.assign(_n << 2, {});build(0, _n - 1);}void init(std::vector<Info> & a) {int _n = (int)a.size();tr.assign(_n << 2, {});build(0, _n - 1, a);}void pushup(int u) {tr[u].info = tr[ls].info + tr[rs].info;}void build(int l, int r, int u = 1) {tr[u] = {l, r, {}};if (l == r) {return;}int mid = l + r >> 1;build(l, mid, ls); build(mid + 1, r, rs);}void build(int l, int r, std::vector<Info> & a, int u = 1) {tr[u] = {l, r, {}};if (l == r) {tr[u].info = a[l];return;}int mid = l + r >> 1;build(l, mid, a, ls); build(mid + 1, r, a, rs);pushup(u);}void modify(int p, Info add, bool set = false) {int u = 1;while (tr[u].l != tr[u].r) {int mid = umid;if (p <= mid) {u = ls;} else {u = rs;}}if (set) {tr[u].info = add;} else {tr[u].info = tr[u].info + add;}u >>= 1;while (u) {pushup(u);u >>= 1;}}Info query(int l, int r, int u = 1) {if (l <= tr[u].l && tr[u].r <= r) {return tr[u].info;}int mid = umid;if (r <= mid) {return query(l, r, ls);}  else if (l > mid) {return query(l, r, rs);}return query(l, r, ls) + query(l, r, rs);}
};struct Info {int max, p;
};Info operator + (const Info & a, const Info & b) {Info res{};if (a.max >= b.max) {res = a;} else {res = b;}return res;
}void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::vector<int> id(n);std::iota(id.begin(), id.end(), 0);std::sort(id.begin(), id.end(), [&](int i, int j) {return a[i] > a[j];});SegmentTree<Info> tr(n);tr.modify(n - 1, Info{a[id[n - 1]], n - 1}, true);for (int i = n - 2; i >= 0; -- i) {tr.modify(i, Info{a[id[i]] - a[id[i + 1]], i}, true);}int p1 = 0, p2 = 1, p3 = 2;int max1 = -1, max2 = -1, max3 = -1;for (int i = 0; i + 2 < n; ++ i) {for (int j = i + 1; j + 1 < n; ++ j) {if ((i + 1) > 2 * (j - i) || j - i > 2 * (i + 1)) {continue;}int l = j + (std::max(i + 1, j - i) + 1) / 2, r = std::min(n - 1, j + std::min(i + 1, j - i) * 2);if (l > r) {continue;}auto [v3, p] = tr.query(l, r);int v1 = a[id[i]] - a[id[i + 1]], v2 = a[id[j]] - a[id[j + 1]];if (v1 > max1 || (v1 == max1 && v2 > max2) || (v1 == max1 && v2 == max2 && v3 > max3)) {max1 = v1;max2 = v2;max3 = v3;p1 = i;p2 = j;p3 = p;}}}std::vector<int> ans(n, -1);for (int i = 0; i <= p1; ++ i) {ans[id[i]] = 1;}for (int i = p1 + 1; i <= p2; ++ i) {ans[id[i]] = 2;}for (int i = p2 + 1; i <= p3; ++ i) {ans[id[i]] = 3;}for (int i = 0; i < n; ++ i) {std::cout << ans[i] << " \n"[i == n - 1];}
}

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

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

相关文章

退役划水十 贝肯茨威格

发暗网上没过审,管理员说要来鲨我,只能发博客园了贝肯是贝肯,茨威格是茨威格,但这里是划水,不是史论,更不是冻鳗理论。 很多人都认为茨威格在《断头王后:玛丽安托瓦内特传》中有一段很文艺,很精辟的评价:“她那时候还太年轻,不知道所有命运赠送的礼物,早已在暗中标好…

How to use Linux shell echo date to a log file All In One

How to use Linux shell echo date to a log file All In One 如何使用 Linux shell 将日期打印输出到日志文件How to use Linux shell echo date to a log file All In One如何使用 Linux shell 将日期打印输出到日志文件solutions # 命令 ✅ $ date >> /etc/rc.local.m…

树莓派3B安装wiringpi失败的解决办法

大家好,我是努力赚钱的小智! 问题描述: 1.安装wiringpi失败 2.输入gpio -v与gpio readall命令出现not found系统信息 树莓派系统是32位!解决办法 1.确认是否需要树莓派系统配置镜像源 2.确认是否已经安装git sudo apt-get install git若遇到上图的情况,请直接按下回车键! …

全链路测试中的影子体系

一、全链路测试的入门理解 1.1什么是全链路测试? 全链路测试是指对系统中所有组件和服务的完整流程进行测试,确保从用户请求到系统响应的每个环节都能正常工作。它覆盖了前端、后端、数据库、第三方服务等所有部分。通俗解释:想象你在网上购物,从搜索商品到下单、支付、收货…

Linux rc.local rc.d All In One

Linux rc.local & rc.d All In One Linux 系统开机/登录自启动配置文件 /etc/rc.local /etc/rc.dLinux rc.local & rc.d All In OneLinux 系统开机/登录自启动配置文件rc.localRaspberry Pi$ cat /etc/rc.localrc.dCentOS / Ubuntu$ ls -al /etc/rc.ddemos eric@rpi3b:…

基本进程调度算法

本文讨论了硬件和操作系统是如何支持进程调度的,并列举了一些进程调度算法。希望本文能帮助读者快速建立起对进程调度的认识。在下一篇文章中,我们将不使用这个假设,再给出一些调度策略。写在前面 在了解了进程的基本概念之后,我们开始学习进程调度算法。本文讨论了硬件和操…

FastAPI 自定义参数验证器完全指南:从基础到高级实战

title: FastAPI 自定义参数验证器完全指南:从基础到高级实战 date: 2025/3/11 updated: 2025/3/11 author: cmdragon excerpt: 本教程深入探讨 FastAPI 中自定义参数验证器的使用,特别是通过 Field 函数进行数据校验。从基础概念到高级用法,通过详细的代码示例、课后测验和…

B端、G端需求调研流程

与C端的流程不同,B端和G端之类的产品,在需求调研阶段就有较多差异。这篇文章,我们来看看作者分享的这些经验。需求调研流程主要包含“调研前准备”、“调研中过程”、“调研后输出”三块内容。调研前:准备 第一步:沟通项目情况 在产品正式需求调研前,相信已经有售前初步跟…

Hetao P1287 小核桃玩核桃棋 题解 [ 蓝 ] [ 观察 ] [ 二维 dp ] [ 容斥原理 ]

很厉害的观察性质,加上 dp 辅助计数的题。小核桃玩核桃棋:质量挺高的一道 dp,好像是搬的某场神秘 ICPC 的?观察 首先我们观察最优解有什么性质,显然这个问题就是要我们选择一些点覆盖所有的行与列。贪心地考虑,不难想出我们从 \((1,1)\) 开始按照对角线来放置,就一定能取…

GAMMA: Revisiting Template-based Automated Program Repair via Mask Prediction 论文笔记

介绍 (1) 发表 2023-09 ASE23 (2) 背景 基于模版的 APR 采用了由人类专家手工制作的维修模式将错误代码片段转变为正确代码片段,被认为是最先进的,大量研究专门用于模版提取方案。然而以前的工作显示出相当数量的错误无法修复,因为相关的错误代码在本地文件中不可用基于深度…

基于模糊PID控制的六步逆变器供电无刷直流电机调速simulink仿真

1.课题概述基于模糊PID控制的六步逆变器供电无刷直流电机调速simulink仿真.将仿真结果和传统的PID控制器的仿真结果进行对比。2.系统仿真结果 (完整程序运行后无水印)1.转速对比,并局部放大显示2.电流对比,并局部放大显示3.电压对比,并局部放大显示4.Te对比,并局部放大显…

Xshell连接虚拟机

Xshell连接Linux虚拟机为了熟悉设用Xshell,但是没卖远程虚拟机,今天使用Xshell连接虚拟机先安装好Xshell进入虚拟机root用户在Linux中输入ip addr指令在输入vi /etc/sysconfig/network-scripts/ifcfg-ens33这里的ens33以上面红框的为准这里要把ONBOOT赋值yes,到这里发现自己…