Codeforces Round 1054 (Div. 3)

news/2025/9/26 2:09:01/文章来源:https://www.cnblogs.com/maburb/p/19112400

A. Be Positive

题意:一个数组\(a\),只包含\(-1, 0, 1\)。你每次可以使得一个数加一,求使得数组乘积为正的最少操作次数。

显然只需要操作\(-1\)或者\(0\)\(0\)必须都加一。那么如果\(-1\)是偶数个,不需要操作,否则需要操作一个\(-1\)两次变成\(1\)

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}int cnt0 = std::ranges::count(a, 0);int cnt1 = std::ranges::count(a, -1);int cnt2 = std::ranges::count(a, 1);if (cnt1 == n) {std::cout << cnt1 % 2 * 2 << "\n";} else if (cnt1 & 1) {std::cout << cnt0 + 2 << "\n";} else {std::cout << cnt0 << "\n";}
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

B. Unconventional Pairs

题意:\(2n\)个数,分成\(n\)对,每对的值为两个数的差的绝对值,这一个分组的价值为所有对的值的最大值。求所有分组里价值最小的。

数组排序后从前往后两个两个分组。这样是最小的。
因为如果交换任意两个数,每

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::ranges::sort(a);int ans = 0;for (int i = 0; i < n; i += 2) {ans = std::max(ans, a[i + 1] - a[i]);}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}
一对的值都大于原来的对。

C. MEX rose

题意:一个数组,每次将一个数变成任意一个数,求数组\(mex\)变成\(k\)的最小操作数。

对于\([0, k)\)的数,如果没有出现过则拿大于等于\(k\)的元素变,优先拿等于\(k\)的变。
这样\(0\)\(k-1\)有了,只需要把多余的\(k\)变成比\(k\)大的数就行。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, k;std::cin >> n >> k;std::vector<int> cnt(n + 1);for (int i = 0; i < n; ++ i) {int x;std::cin >> x;++ cnt[x];}int ans = 0;for (int i = 0; i < k; ++ i) {if (!cnt[i]) {ans += 1;cnt[k] = std::max(0, cnt[k] - 1);}}ans += cnt[k];std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

D. A and B

题意:一个只包含\(a\)\(b\)的字符串,每次可以交换相邻两个元素。求把某一类字符都合并成一块的最小操作数。

假设把\(a\)合并到一块,可以先把所有\(a\)移到最前面,那么从前往后可以直到每个\(a\)需要移动的次数,用\(cnt_i\)表示有\(cnt_i\)\(a\)需要往前移动\(i\)次。那么现在考虑枚举把整块往后一步一步移,那么如果往右移动了\(k\)步,则需要往前移动\([k, n]\)的都可以少移动一步。对于需要移动\([0, k-1]\)的都需要往后多移动一步。记录前缀和后缀和就可以计算。
\(b\)合并一块同理计算。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::string s;std::cin >> s;auto get = [&](std::string s) -> i64 {std::vector<i64> sum(n + 1);i64 v = 0;for (int i = 0, j = 0; i < n; ++ i) {if (s[i] == 'a') {sum[i - j] += 1;v += i - j;++ j;}}std::vector<int> pre(n), suf(n + 1);pre[0] = sum[0];for (int i = 1; i < n; ++ i) {pre[i] = pre[i - 1] + sum[i];}for (int i = n - 1; i >= 0; -- i) {suf[i] = suf[i + 1] + sum[i];}i64 res = v;for (int i = 0; i < n; ++ i) {v -= suf[i + 1];v += pre[i];res = std::min(res, v);}return res;};i64 ans = get(s);for (auto & c : s) {c = c == 'a' ? 'b' : 'a';}ans = std::min(ans, get(s));std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

E. Hidden Knowledge of the Ancients

题意:给你一个数组\(a\),求有多少子数组,长度在\([l, r]\)之间,且恰好有\(k\)个不同的数。

考虑双指针求对于\(i\)作为左端点时,最小的右端点\(j\)使得\([i, j]\)恰好有\(cnt\)个不同的数。
可以用\(multiset\)维护。
那么求得\(cnt = k, cnt = k + 1\)时的答案,就可以知道恰好有\(k\)个数的右端点的取值区间。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, k, l, r;std::cin >> n >> k >> l >> r;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::multiset<int> s;int cnt = 0;auto add = [&](int x) -> void {if (s.find(x) == s.end()) {++ cnt;}s.insert(x);};std::vector<int> p1(n), p2(n);for (int i = 0, j = 0; i < n; ++ i) {j = std::max(i, j);while (j < n && j - i + 1 <= r && cnt < k) {add(a[j]);++ j;}if (cnt == k) {p1[i] = j - 1;} else {p1[i] = n;}p1[i] = std::max(p1[i], i + l - 1);s.extract(a[i]);if (!s.count(a[i])) {-- cnt;}}s.clear();cnt = 0;++ k;for (int i = 0, j = 0; i < n; ++ i) {j = std::max(i, j);while (j < n && j - i + 1 <= r && cnt < k) {add(a[j]);++ j;}if (cnt == k) {p2[i] = j - 1;} else {p2[i] = j;}s.extract(a[i]);if (s.find(a[i]) == s.end()) {-- cnt;}}i64 ans = 0;for (int i = 0; i < n; ++ i) {ans += std::max(0, p2[i] - p1[i]);}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

F. Nezuko in the Clearing

题意:需要移动\(d\)步,一开始有\(h\)点血。每次可以移动一步,如果连续移动\(i\)次这一步会使得\(h\)\(i\)。你也可以选择休息一回合,这使得\(h\)加一。任何时候\(h\)都要大于\(0\)。求移动\(d\)步的操作次数。

首先,每次最多连续休息一回合。因为如果多休息一回合,不如让上一次连续移动里少移动一步。
那么如果休息了\(m\)回合,则把\(d\)步分成了\(m+1\)段,一个段长为\(l\)的段需要\(\frac{l(l+1)}{2}\)的血量。我们应该让每一段长度尽可能接近,即\(a = \lfloor \frac{d}{m+1} \rfloor, r = d \% (m + 1)\),那么应该是\(m + 1 - r\)个长度为\(a\)的段,\(r\)个长度为\(a+1\)的段。因为如果有两个段使得其中一段步数比另一段大于等于\(2\),则把多的一段分一些给少的一段更好。
那么只需要\(h + m > (m + 1 - r)\times \frac{a(a+1)}{2} + r\times \frac{(a+1)(a+2)}{2}\)\(m+1\)段就是可以的。
发现\(k\)段能行的话,分比\(k\)多的段也行,则可以二分。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;void solve() {i64 h, d;std::cin >> h >> d;auto check = [&](i64 m) -> bool {i64 a = d / (m + 1), r = d % (m + 1);i64 sum = a * (a + 1) / 2 * (m + 1 - r) + (a + 1) * (a + 2) / 2 * r;return sum + 1 <= h + m;};i64 lo = 1, hi = d;while (lo < hi) {i64 mid = lo + hi >> 1ll;if (check(mid)) {hi = mid;} else {lo = mid + 1;}}i64 ans = std::max(0ll, d * (d + 1) / 2 + 1 - h) + d;std::cout << std::min(ans, d + lo) << "\n";
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

G. Buratsuta 3

题意:一个数组,每次问一个区间\([l, r]\)有哪些数出现次数大于\(\lfloor \frac{r-l+1}{3} \rfloor\)

因为一个数需要出现大于\(\lfloor \frac{r-l+1}{3} \rfloor\)次,则这样的数不超过\(2\)个。
可以用Boyer–Moore 投票算法。
假设是求出现次数大于\(\lfloor \frac{r-l+1}{2} \rfloor\)的数,那么这样的数最多有\(1\)个。这个数的出现次数肯定大于其它数,可以从前往后遍历,记\(x = a[l], c = 1\),如果\(a_i = x\),则\(c += 1\),否则\(c -= 1\);如果\(c == 0\),则\(x = a[i]\)。最后\(x\)可能是答案。因为这样相当于两个两个不同的数抵消,最后剩下的一定是出现最多的数。
推广到求出现次数大于\(\lfloor \frac{r-l+1}{k} \rfloor\)的数,那么这样的数不超过\(k-1\)个,可以维护\(k-1\)\(x\)。对于遇到的一个数,如果在这\(k-1\)\(x\)里,则累加次数,否则和所有\(x\)出现的次数一起抵消掉。
然后对于这道题,他每次是求一个区间,我们可以用线段树维护。
然后这里求出的是可能作为答案的数,我们还需要记录它们的出现位置,然后二分求一下\([l, r]\)它们出现了多少次。

点击查看代码
#include <bits/stdc++.h>using i64 = long long;template <class Info>
struct SegmentTree {struct Node {int l, r;Info info;};std::vector<Node> tr;SegmentTree() {};SegmentTree(int n) {init(n);}SegmentTree(std::vector<int> & info) {init(info);}void init(int n) {tr.assign(n << 2, {});build(0, n - 1);}void init(std::vector<int> & info) {int n = info.size();tr.assign(n << 2, {});std::function<void(int, int, int)> build = [&](int l, int r, int u) -> void {tr[u] = {l, r, {}};if (l == r) {tr[u].info.insert(info[l], 1);return;}int mid = l + r >> 1;build(l, mid, u << 1); build(mid + 1, r, u << 1 | 1);pushup(u);};build(0, n - 1, 1);}void pushup(int u) {tr[u].info = tr[u << 1].info + tr[u << 1 | 1].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, u << 1); build(mid + 1, r, u << 1 | 1);pushup(u);}void modify(int p, const Info & info, bool set = false) {int u = 1;while (tr[u].l != tr[u].r) {int mid = tr[u].l + tr[u].r >> 1;if (p <= mid) {u = u << 1;} else {u = u << 1 | 1;}}if (set) {tr[u].info = info;} else {tr[u].info = tr[u].info + info;}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 = tr[u].l + tr[u].r >> 1;if (r <= mid) {return query(l, r, u << 1);} else if (l > mid) {return query(l, r, u << 1 | 1);}return query(l, r, u << 1) + query(l, r, u << 1 | 1);}
};struct Info {int x[2], c[2];void insert(int X, int C) {if (c[0] && x[0] == X) {c[0] += C;} else if (c[1] && x[1] == X) {c[1] += C;} else {int min = std::min({c[0], c[1], C});c[0] -= min;c[1] -= min;C -= min;if (!C) {return;;}if (c[0] == 0) {x[0] = X;c[0] = C;} else if (c[1] == 0) {x[1] = X;c[1] = C;}}}
};Info operator + (const Info & l, const Info & r) {Info res{};res.insert(l.x[0], l.c[0]);res.insert(l.x[1], l.c[1]);res.insert(r.x[0], r.c[0]);res.insert(r.x[1], r.c[1]);return res;
}void solve() {int n, q;std::cin >> n >> q;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}auto b = a;std::ranges::sort(b);b.erase(std::unique(b.begin(), b.end()), b.end());for (auto & x : a) {x = std::ranges::lower_bound(b, x) - b.begin();}int m = b.size();std::vector<std::vector<int>> pos(m);for (int i = 0; i < n; ++ i) {pos[a[i]].push_back(i);}SegmentTree<Info> tr(a);while (q -- ) {int l, r;std::cin >> l >> r;-- l, -- r;int k = (r - l + 1) / 3;std::vector<int> ans;auto info = tr.query(l, r);for (int i = 0; i < 2; ++ i) {int x = info.x[i], y = info.c[i];if (y == 0) {continue;}int L = std::ranges::lower_bound(pos[x], l) - pos[x].begin();int R = std::ranges::upper_bound(pos[x], r) - pos[x].begin();if (R - L > k) {ans.push_back(b[x]);}}if (ans.empty()) {std::cout << -1 << "\n";} else {std::ranges::sort(ans);for (auto & x : ans) {std::cout << x << " \n"[x == ans.back()];}}}
}int main() {std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);int t = 1;std::cin >> t;while (t -- ) {solve();}return 0;
}

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

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

相关文章

淘宝客户自己做网站怎么做wordpress小程序怎么不用认证审核

需求&#xff1a;一个机构下拉菜单&#xff0c;一个人员下拉菜单&#xff0c;默认带入当前登录用户的机构和人员。机构下拉菜单为两个接口&#xff0c;模糊查询为一个接口不包含懒加载&#xff0c;默认非模糊查询情况下为一个接口&#xff0c;点击节点懒加载。机构下拉菜单数据…

江西网站设计团队wordpress 不显示主题

在日常Mysql和Oracle数据库使用时&#xff0c;经常使用到查看表、索引等信息&#xff0c;记录下来&#xff0c;方便备查。 MySQL 主要是使用 information_schema 信息表&#xff1b; Oracle 主要是使用 各种视图&#xff0c;如user_ind_columns。 一、查看所有表 MySQL查看表…

百度网站联盟电商网站建设方案模板下载

namedtuple(具名元组) namedtuple是tuple的升级,目的是解决元组内部的数据进行命名的问题,为了说明namedtuple的优点,我们先看一下tuple的例子,如下代码,声明了课程的元祖,但是元组中两项内容没有说明,如果其他人看到代码不知道意思是什么 course = ("Python教程…

Natural Language Processing

NLP before LLM Context-free Grammar A context-free grammar (CFG) contains a set of production rules, which are rules saying how each nonterminal can be replaced by a string of terminals and non-termina…

东莞做企业宣传网站wordpress调用post的发布时间

1.基本使用 2.参数和返回值 函数里只有一行代码 log没有返回值&#xff0c;所以是undefined 结果为 Hello Demo undefined 箭头函数&#xff1a; 在函数作为另外一个函数参数的时候&#xff0c;适合用箭头函数 3.箭头函数的this 返回值都是window 返回值&#xff0c;一…

美橙互联建站网页制作基础教程第二章

Configuration 作用 Configuration 注解的核心作用是把一个类标记为 Spring 应用上下文里的配置类。配置类就像一个 Java 版的 XML 配置文件&#xff0c;能够在其中定义 Bean 定义和 Bean 之间的依赖关系。当 Spring 容器启动时&#xff0c;会扫描这些配置类&#xff0c;解析其…

网站上传不了北海网站建设服务商

一、OCPP协议介绍 OCPP的全称是 Open Charge Point Protocol 即开放充电点协议&#xff0c; 它是免费开放的协议&#xff0c;该协议由位于荷兰的组织 OCA&#xff08;开放充电联盟&#xff09;进行制定。Open Charge Point Protocol (OCPP) 开放充电点协议用于充电站(CS)和任何…

中国太空网站做网站还是网页设计

1.理解用户级线程 我们前面用到的所有跟线程有关的接口全部都不是系统直接提供的接口&#xff0c;而是原生线程库pthread提供的接口。我们前面谈到了由于用户只认线程&#xff0c;而linux操作系统是通过用轻量级进程模拟线程&#xff0c;并不是真正的线程&#xff0c;所以linu…

南京华典建设有限公司网站专门做旅游的网站有哪些

Broker内存映射机制与高效磁盘 RocketMQ在存储涉及中通过内存映射、顺序写文件等方式实现了高吞吐。 RocketMQ的基本数据结构: CommitLog:RocketMQ对存储消息的物理文件的抽象实现&#xff0c;也就是对物理CommitLog文件的具体实现。MappedFile:CommitLog文件在内存中的映射文…

邢台网站制作哪里做什么是互联网公司

jar命令格式&#xff1a;jar {c t x u f }[ v m e 0 M i ][-C 目录]文件名其中{ctxu}这四个参数必须选选其一。[v f m e 0 M i ]是可选参数&#xff0c;文件名也是必须的。所有的参数说明&#xff1a;-c 创建一个jar包-t 显示jar中的内容列表-x 解压jar包-u 添加文件到jar包中-…

Python 在自动化与运维中的价值与实践

一、引言 ⚡ 在信息化时代,自动化与运维已经成为企业 IT 基础设施的核心组成部分。从服务器管理到应用部署,从日志分析到故障排查,自动化能够显著提升效率,降低人工操作的失误率。Python 作为脚本语言起家,凭借其…

行政机关单位网站建设要求房地产市场低迷

目录 Redis - 概述 使用场景 如何安装 Window 下安装 Linux 下安装 docker直接进行安装 下载Redis镜像 Redis启动检查常用命令 Redis - 概述 redis是一款高性能的开源NOSQL系列的非关系型数据库,Redis是用C语言开发的一个开源的高键值对(key value)数据库,官方提供测试…

Postgresql17增量备份demo

#include <iostream> #include <string> #include <vector> #include <filesystem> #include <chrono> #include <iomanip> #include <sstream> #include <cstdlib> …

Nodejs install

C compiler installsudo apt-get update sudo apt-get install build-essentialdownload source codetar xf node-v22.19.0.tar.xz cd node-v22.19.0 sudo ./configure sudo make sudo make installnode --version

泉州网站关键词排名做网站什么主题好做

---恢复内容开始--- 操作标签 样式操作 样式类 addClass();//添加指定的CSS类名。 removeClass();//移除指定的类名. hasClass();//判断样式不存在 toggleClass();//切换css类名&#xff0c;如果有就移除&#xff0c;如果没有就添加 示例&#xff1a;开关灯和模态框 CSS css(&q…

连云港做网站制作首选公司seo网站优化推广怎么样

问题&#xff1a; 因为要测试一些东西&#xff0c;所以必须有中文数据来做支撑&#xff0c;之前用的架构是x86&#xff0c;现在一个服务器的架构为arrch64&#xff0c;下列编码都挨个都进行声明&#xff0c;但是无法解决问题&#xff0c;总是报错 # -*- coding: gbk -*- # -*…

河南省建设安全监督站的网站做章网站

学习目的 Boost 的学习目的&#xff1a; 因为从知乎和CSND上根据了解内容来看&#xff0c;Boost作为一个历史悠久的开源库&#xff0c;已经脱离了一个单纯的库的概念了&#xff0c;他因庞大的涉及面应当被称之为库集。 并且&#xff0c;因为boost库优秀的试用反馈和开发人员的…

工信部申诉备案网站电脑显示无法运行wordpress

DiffBIR 发表于2023年的ICCV&#xff0c;是一种基于生成扩散先验的盲图像恢复模型。它通过两个阶段的处理来去除图像的退化&#xff0c;并细化图像的细节。DiffBIR 的优势在于提供高质量的图像恢复结果&#xff0c;并且具有灵活的参数设置&#xff0c;可以在保真度和质量之间进…

网站集约化建设探讨广告制作与设计专业

文章目录 1. Unsafe Filedownload1.1 Unsafe Filedownload1.1.1 源代码分析1.1.2 漏洞防御 1.2 不安全的文件下载防御措施 1. Unsafe Filedownload 不安全的文件下载概述&#xff1a; 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c;便会…

尚品本色木门网站是哪个公司做的ui培训班多少钱

1、报文首部 HTTP协议的请求和响应必定包含HTTP首部&#xff0c;它包括了客户端和服务端分别处理请求和响应提供所需要的信息。报文主体字儿是所需要的用户和资源的信息都在这边。  HTTP请求报文组成 方法&#xff0c;URL&#xff0c;HTTP版本&#xff0c;HTTP首部字段 HTTP响…