Codeforces Round 954 (Div. 3) A~F

A.X Axis(暴力)

题意:

X X X轴( 1 ≤ x i ≤ 10 1\leq x_i\leq 10 1xi10)上有三个点,其整数坐标分别为 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3。您可以选择 X X X轴上任何一个整数坐标为 a a a的点。请注意,点 a a a可能与 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3重合。设 f ( a ) f(a) f(a)是给定点到点 a a a的总距离。求 f ( a ) f(a) f(a)的最小值。

a a a b b b之间的距离等于 ∣ a − b ∣ |a-b| ab。例如,点 a = 5 a=5 a=5 b = 2 b=2 b=2之间的距离为 3 3 3

分析:

暴力枚举一下所有可能,取最小值即可。

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;void solve() {LL a, b, c;cin >> a >> b >> c;LL ans = 100;for (LL i = 0; i <= 10; i++) {ans = min(ans, abs(i - a) + abs(i - b) + abs(i - c));}cout << ans << endl;
}int main() {int t;cin >> t;while (t--)solve();return 0;
}

B.Matrix Stabilization(模拟)

题意:

给你一个大小为 n × m n\times m n×m的矩阵,其中行的编号从上到下为 1 1 1 n n n,列的编号从左到右为 1 1 1 m m m。位于第 i i i行和第 j j j列交点上的元素用 a i j a_{ij} aij表示。

考虑稳定矩阵 a a a的算法:

  1. 找到单元格 ( i , j ) (i,j) (i,j)使其值严格大于所有相邻单元格的值。如果没有这样的单元格,则终止算法。如果有多个这样的单元格,则选择 i i i值最小的单元格;如果仍有多个单元格,则选择 j j j值最小的单元格。
  2. 设置 a i j = a i j − 1 a_{ij}=a_{ij}-1 aij=aij1
  3. 转到步骤 1 1 1

在此问题中,如果单元格 ( a , b ) (a,b) (a,b) ( c , d ) (c,d) (c,d)有一个共同的边,即 ∣ a − c ∣ + ∣ b − d ∣ = 1 |a-c|+|b-d|=1 ac+bd=1,那么这两个单元格就被视为相邻单元格。

您的任务是在执行稳定算法后输出矩阵 a a a。可以证明这种算法不可能运行无限次迭代。

分析:

按题意进行模拟。从上到下,从左到右枚举元素,每次如果此元素严格大于周围的元素,就赋值为周围四个元素中最大的。因为操作以后还是没有严格小于周围的元素,所以操作后不会使得前面的元素不符合要求。

注意,边上的元素取最大值时可能会超出边界,所以每组数据要把边界外的元素都设为 0 0 0

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;
const int N = 2005;
LL a[N][N];void solve() {LL n, m;cin >> n >> m;for (LL i = 0; i <= n + 1; i++) {a[i][0] = 0;a[i][m + 1] = 0;}for (LL i = 0; i <= m + 1; i++) {a[0][i] = 0;a[n + 1][i] = 0;}for (LL i = 1; i <= n; i++) {for (LL j = 1; j <= m; j++) {cin >> a[i][j];}}for (LL i = 1; i <= n; i++) {for (LL j = 1; j <= m; j++) {a[i][j] = min(a[i][j], max(a[i - 1][j], max(a[i + 1][j], max(a[i][j - 1], a[i][j + 1]))));cout << a[i][j] << ' ';}cout << endl;}
}int main() {int t;cin >> t;while (t--)solve();return 0;
}

C.Update Queries(排序)

题意:

下面是一个简单的问题。给你一个长度为 n n n的字符串 s s s(由小写拉丁字母组成),以及一个长度为 m m m( 1 ≤ i n d i ≤ n 1\leq ind_i\leq n 1indin)的索引数组 i n d ind ind和一个长度为 m m m的字符串 c c c(由小写拉丁字母组成)。然后,按顺序执行更新操作,即在第 i i i个操作中,设置 s i n d i = c i s_{ind_i}=c_i sindi=ci。请注意,所有的 m m m操作都是从第一个操作到最后一个操作。

当然,如果改变数组 i n d ind ind中索引的顺序和/或字符串 c c c中字母的顺序,会得到不同的结果。如果数组 i n d ind ind中的索引和字符串 c c c中的字母顺序可以随意改变,那么在进行 m m m次更新操作后,可以得到的字典序最小的字符串 s s s

当且仅当满足以下条件之一时,字符串 a a a在字典序上小于字符串 b b b

  • a a a b b b的前缀,但 a ≠ b a\neq b a=b
  • a a a b b b不同的第一个位置,字符串 a a a中的符号在字母表中的位置比字符串 b b b中的相应符号早。

分析:

我们发现 i d n idn idn c c c都可以重新排列,考虑对其进行排序。如果 i d n idn idn的元素全部满足两两不相同,则直接在排序后按顺序填入即可,因为这样保证字典序小的排在了前面。对于相同的元素,先插入的元素会被后面的覆盖掉,只需要考虑最后一次操作,而前面的操作则用字典序最大的来顶替即可。

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;
const int N = 1e5 + 5;
int idn[N];
string s, t;void solve() {LL n, m;t = "";cin >> n >> m >> s;for (int i = 1; i <= m; i++)cin >> idn[i];for (int i = 1; i <= m; i++) {char tmp;cin >> tmp;t += tmp;}sort(idn + 1, idn + 1 + m);sort(t.begin(), t.end());deque<char> q;for (int i = 0; i < t.size(); i++)q.push_back(t[i]);for (int i = 1; i <= m; i++) {if (idn[i] != idn[i - 1]) {s[idn[i] - 1] = q.front();q.pop_front();} else {q.pop_back();}}cout << s << endl;
}int main() {int T;cin >> T;while (T--)solve();return 0;
}

D.Mathematical Problem(数学)

题意:

给你一个长度 n > 1 n\gt 1 n>1的字符串 s s s,由从 0 0 0 9 9 9的数字组成。您必须在这个字符串中准确插入 n − 2 n-2 n2 + + +(加法)符号或 × \times ×(乘法)符号,才能形成一个有效的算术表达式。

在本题中,符号不能放在字符串 s s s的第一个字符之前或最后一个字符之后,也不能连续写入两个符号。此外,请注意字符串中数字的顺序不能改变。以 s = 987009 s=987009 s=987009为例:

  • 从这个字符串可以得到以下算术表达式: 9 × 8 + 70 × 0 + 9 = 81 9\times 8+70\times 0+9=81 9×8+70×0+9=81, 98 × 7 × 0 + 0 × 9 = 0 98\times 7\times 0+0\times 9=0 98×7×0+0×9=0, 9 + 8 + 7 + 0 + 09 = 9 + 8 + 7 + 0 + 9 = 33 9+8+7+0+09=9+8+7+0+9=33 9+8+7+0+09=9+8+7+0+9=33。请注意,数字 09 09 09被认为是有效的,并被转换为 9 9 9
  • 从该字符串中无法得到以下算术表达式: + 9 × 8 × 70 + 09 +9\times 8\times 70+09 +9×8×70+09(符号只能放在数字之间)、 98 × 70 + 0 + 9 98\times 70+0+9 98×70+0+9(因为有 6 6 6个数字,所以必须正好有 4 4 4个符号)。

算术表达式的结果是根据数学规则计算出来的–首先进行所有乘法运算,然后是加法运算。您需要找出在给定的字符串 s s s中插入恰好 n − 2 n-2 n2个加法或乘法符号所能得到的最小结果。

分析:

本题我们分情况考虑

考虑 n = 2 n=2 n=2的情况,不能加运算符,如果第一个字符为 0 0 0,则输出第二个字符,否则输出 s s s

考虑 n = 3 n=3 n=3且有 0 0 0 0 0 0在中间的情况,答案为第一个和第三个字符乘积或者相加中较小的一个。

其他长度的情况:如果有 0 0 0,则将所有运算符置为乘,最后结果就是 0 0 0。如果没有 0 0 0,则将 s s s中所有不为 1 1 1的数统计求和。此时的求和有 n − 1 n-1 n1个运算符,其中涉及到 1 1 1的运算符全为*,不涉及 1 1 1的运算符全为+。此时需要去掉一个运算符,再次遍历 s s s,依此考虑将 s s s中任意两个相邻的字符组合成一个二位数字,看哪个组合最后得到的结果最小,取最小值即可。

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;
const LL MAXN = 0x3f3f3f3f;
string s;void solve() {int n;cin >> n >> s;if (n == 2) {if (s[0] == '0')cout << s[1] << endl;elsecout << s << endl;} else if (n == 3 && s[1] == '0') {cout << min(s[0] + s[2] - '0' * 2, (s[0] - '0') * (s[2] - '0')) << endl;} else if (s.find('0') != std::string::npos) {cout << "0" << endl;} else {int sum = 0;for (const auto &x: s) {if (x > '1') {sum += x - '0';}}int ans = MAXN;for (int i = 0; i < n - 1; ++i) {int num = stoi(s.substr(i, 2));ans = min(ans, sum - (s[i] == '1' ? 0 : s[i] - '0') - (s[i + 1] == '1' ? 0 : s[i + 1] - '0') + num);}cout << ans << endl;}
}int main() {int t;cin >> t;while (t--)solve();return 0;
}

E.Beautiful Array(数据结构)

题意:

给你一个整数数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an和一个整数 k k k。您需要用最少的运算使数组变得美丽。

在进行操作前,可以随意对数组元素进行洗牌。对于一次操作,可以进行以下操作:

  • 选择一个索引 1 ≤ i ≤ n 1\leq i\leq n 1in.
  • 生成 a i = a i + k a_i=a_i+k ai=ai+k

如果所有的 1 ≤ i ≤ n 1\leq i\leq n 1in都是 b i = b n − i + 1 b_i=b_{n-i+1} bi=bni+1,那么数组 b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1,b2,,bn是美丽的。

求使数组美丽所需的最小运算次数,或者输出不可能。

分析:

首先利用map a a a中的出现偶数次的元素去掉。我们发现如果一个数能通过另一个数相加若干个 k k k得到,则这两个数%k的余数是相等的。将剩下的元素 % k \%k %k存到map<int,vector>中,遍历这个新的map,对vector排序。如果vector中的元素数量是偶数,那么可以将相邻的两个vector作为一组进行 + k +k +k变换。如果vector中的元素数量是奇数,那么这样的vector不能超过 1 1 1个,维护一个前缀和后缀和来讨论vector中哪个元素作为回文中心,不参与到这种配对的计算中。

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;void solve() {int n, k;cin >> n >> k;map<int, int> mapp;for (int i = 0; i < n; i++) {int t;cin >> t;mapp[t]++;}vector<int> a;for (const auto &[x, y]: mapp) {if (y & 1) {a.push_back(x);}}if ((int) a.size() <= 1) {cout << "0" << endl;return;}map<int, vector<int>> rec;for (int i = 0; i < a.size(); ++i) {int t = a[i];rec[t % k].push_back(t);}int cnt = 0;LL ans = 0;for (auto &[x, cur]: rec) {bool ok = true;if (cur.size() & 1) {cnt++;ok = false;if (cnt > 1) {cout << "-1" << endl;return;}}sort(cur.begin(), cur.end());if (ok) {for (int i = 1; i < cur.size(); i += 2) {ans += (cur[i] - cur[i - 1]) / k;}} else if (cur.size() > 1) {int m = (int) cur.size();vector<LL> pref(m);vector<LL> suff(m);pref[1] = cur[1] - cur[0];for (int i = 3; i < m; i += 2) {pref[i] = pref[i - 2] + cur[i] - cur[i - 1];}suff[m - 2] = cur[m - 1] - cur[m - 2];for (int i = m - 4; i >= 0; i -= 2) {suff[i] = suff[i + 2] + cur[i + 1] - cur[i];}LL minn = min(pref[m - 2], suff[1]);for (int i = 2; i < m - 2; i += 2) {minn = min(minn, pref[i - 1] + suff[i + 1]);}ans += minn / k;}}cout << ans << endl;
}int main() {int t;cin >> t;while (t--)solve();return 0;
}

F.Non-academic Problem(联通分量)

题意:

给你一个连通的无向图,其顶点用 1 1 1 n n n之间的整数编号。你的任务是尽量减少图中存在路径的顶点 1 ≤ u < v ≤ n 1\leq u\lt v\leq n 1u<vn对的数量。为了实现这一目标,你可以从图形中删除一条边。

请找出顶点对的最小数目!

分析:

整个图是连通的,删除边双内的边并不会影响连通性,删除桥边会变成两个连通块,一个大小为 x x x另一个则为 n − x n−x nx

对于一个大小为 x x x的连通块,编号最小的点有另外 x − 1 x−1 x1个点与其对应,以此类推,因此满足条件的点对数量是:
∑ i = 1 x − 1 i = x ( x − 1 ) 2 \sum_{i=1}^{x-1}i=\frac{x(x-1)}{2} i=1x1i=2x(x1)

考虑将图缩点为边双连通分量,然后只枚举桥边(即树边),对于所有情况取一个最小值即可。

代码:

#include<bits/stdc++.h>typedef long long LL;
using namespace std;
const int N = 100010;
const int M = 200010;
int h[N], sz[N], dfn[N], low[N], id[N], szedcc[N], idx, n, m, timestamp, cntedcc;
stack<int> stk;
vector<int> G[N];
set<LL> S;
LL ans;struct Edge {int to, nxt;
} e[M];void add(int a, int b) {e[idx] = {b, h[a]};h[a] = idx++;
}void tarjan(int u, int from) {stk.push(u);dfn[u] = low[u] = ++timestamp;for (int i = h[u]; i; i = e[i].nxt) {int to = e[i].to;if (!dfn[to]) {tarjan(to, i);low[u] = min(low[u], low[to]);} else if (i != (from ^ 1))low[u] = min(low[u], dfn[to]);}if (low[u] == dfn[u]) {++cntedcc;int y;do {y = stk.top();stk.pop();id[y] = cntedcc;szedcc[cntedcc]++;} while (y != u);}
}LL calc(LL x) {return x * (x - 1) / 2;
}void dfs(int u, int f) {sz[u] = szedcc[u];for (int to: G[u]) {if (to == f)continue;dfs(to, u);sz[u] += sz[to];ans = min(ans, calc(sz[to]) + calc(n - sz[to]));}
}int main() {int t;cin >> t;while (t--) {cin >> n >> m;idx = 2;timestamp = cntedcc = 0;S.clear();for (int i = 0; i <= n; i++) {h[i] = dfn[i] = szedcc[i] = sz[i] = id[i] = low[i] = 0;vector<int>().swap(G[i]);}for (int i = 1, a, b; i <= m; i++) {cin >> a >> b;add(a, b);add(b, a);}for (int i = 1; i <= n; i++) {if (!dfn[i])tarjan(i, -1);}for (int u = 1; u <= n; u++) {for (int i = h[u]; i; i = e[i].nxt) {int to = e[i].to;int A = id[u], B = id[to];if (A < B)swap(A, B);if (id[u] != id[to]) {LL hash = 1ll * A * N + B;if (S.count(hash))continue;S.insert(hash);G[id[u]].emplace_back(id[to]);G[id[to]].emplace_back(id[u]);}}}ans = calc(n);dfs(1, 0);cout << ans << endl;}return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

一分钟学习数据安全—自主管理身份SSI分布式标识DID介绍

SSI标准化的两大支柱&#xff0c;一个是VC&#xff0c;之前简单介绍过&#xff0c;另一个就是DID。基本层次上&#xff0c;DID就是一种新型的全局唯一标识符&#xff0c;跟浏览器的URL没有什么不同。深层次上&#xff0c;DID是互联网分布式数字身份和PKI新层级的原子构件。 一…

分别使用netty和apache.plc4x测试读取modbus协议的设备信号

记录一下常见的工业协议数据读取方法 目录 前言Modbus协议说明Netty 读取测试使用plc4x 读取测试结束语 前言 Modbus 是一种通讯协议&#xff0c;用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体&#xff1a;Modbus RTU 和 Modbus TCP/IP Modbus …

通过验证邮箱进行注册信息确认

应用在进行注册时&#xff0c;避免恶意攻击和垃圾注册&#xff0c;可以通过验证注册者身份后才能够提交。一般可以使用验证手机短信或者验证邮箱&#xff0c;验证短信会有专门的第三方服务&#xff0c;可以进行付费购买。验证邮箱的正确与否&#xff0c;可以通过以下2种方式进行…

Linux 安装 MySQL 8.0.26

1、MySQL 8.0.26 下载 官方网站下载 MySQL 8.0.26 安装包&#xff0c;下载地址&#xff1a;mysql8.0.26 本案例采用Linux 64位操作系统进行讲解&#xff0c;通过wget命令下载安装包。 使用df -lh命令查看&#xff0c;磁盘大小&#xff0c;尽量安装在比较大的磁盘下&#xff0c…

vue3+ts <script setup lang=“ts“> element-plus的el-date-picker设置默认日期

效果图&#xff08;单个日期&#xff09;&#xff1a; utils.ts&#xff1a; /*** 格式化时间戳* param {number} timestamp 时间戳* param {string} format 格式* returns {string}*/ export const formatTimeStamp (timestamp: number, format: string) > {if (!timesta…

Linux系统防火墙iptables(下)

备份与还原iptables规则设置 1、yum -y install iptables iptables-services 安装iptables软件包 2、systemctl start iptables.service 开启服务 3、systemctl enable iptables.service 开机自启 我们对iptables命令行中的设置&#xff0c;都是临时设置&#xff0c;只要遇到服…

GPT-5

欢迎来到 Papicatch的博客 文章目录 &#x1f349;技术突破预测 &#x1f348;算法进步 &#x1f348;理解力提升 &#x1f348;行业推动力 &#x1f349;人机协作的未来 &#x1f348;辅助决策 &#x1f348;增强创造力 &#x1f348;复杂任务中的角色 &#x1f348;人…

深入剖析Tomcat(十三) Host、Engine 容器

前面很多篇文章都在介绍Context与Wrapper两个容器&#xff0c;因为这两个容器确实也比较重要&#xff0c;与我们日常开发也息息相关&#xff0c;但是Catalina是存在四个容器的&#xff0c;这一章就来简单看看Host与Engine这两个容器。 再次展示下Catalina的容器结构&#xff0…

VS2022(Visual Studio 2022)最新安装教程

1、下载 1、下载地址 - 官网地址&#xff1a;下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux - 根据自己的电脑的 【操作系统】 灵活选择。 2、安装包 【此处为Windows系统安装包】 2、安装 1、打开软件 - 右击【以管理员身份打开】&#xff0c; 2、准备配置 …

Web Serial串口通信实现WEB浏览器读写M1卡

本示例使用的设备&#xff1a;RS232串口RFID NFC IC卡读写器可二次开发编程发卡器USB转COM-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &l…

优思学院|工厂的部门架构管理与精益生产

工厂内有不同部门&#xff0c;各部门之间必须协调合作才能发挥整体功能。工厂最主要的部分是制造产品的现场&#xff0c;这里安装了生产工具&#xff0c;还有操作员进行加工或生产制造。 制造时使用的材料或零组件&#xff0c;需要对外采购。对于加工组装型的工厂&#xff0c;…

基于Boost和平均电流控制方法的APFC电路设计

通过学习无线充电相关知识&#xff0c;为更快熟悉APFC工作原理&#xff0c;通过实验得以掌握 技术要求&#xff1a; 1&#xff09;输入电压&#xff1a;AC 85V&#xff5e;265V&#xff1b; 2&#xff09;输出电压&#xff1a;400V1%&#xff1b; 3&#xff09;输出额定电流…

音视频开发30 FFmpeg 视频编码- 流程以及重要API,H264编码原理说明,该章节使用h264编码说明

一.H264编码原理 1 视频为什么需要进行编码压缩 ◼ 一张为 720x480 的图像&#xff0c;用 YUV420P 的格式来表示&#xff0c;其大小为&#xff1a; 720*480*1.5 约等于 0.5MB 。 ◼ 如果是 25 帧&#xff0c; 10 分钟的数据量 0.5M*10*60*25 7500MB -> 7GB 多 ◼ …

自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

blender 快捷键 常见问题

一、快捷键 平移视图&#xff1a;Shift 鼠标中键旋转视图&#xff1a;鼠标中键缩放视图&#xff1a;鼠标滚动框选放大模型&#xff1a;Shift B线框预览和材质预览切换&#xff1a;Shift Z 二、常见问题 问题&#xff1a;导入模型成功&#xff0c;但是场景中看不到。 解…

电路与数字逻辑期末复习重点整理!!

1.带无关项的卡诺图 2.置数法设计N进制电路 计数器&#xff1a;具有记忆输入脉冲个数功能的电路称为计数器。 按照各个触发器状态更新情况的不同可分为&#xff1a; 同步计数器&#xff1a;各触发器受同一时钟脉冲─输入计数脉冲控制&#xff0c;同步更新状态。异步计数器&a…

阿里云centos 7.9 使用宝塔面板部署.netcore 6.0

前言&#xff1a; 我有一个netcore6.0的系统接口和手机端程序的站点程序之前是部署在一台windows测试服务器的IIS站点中&#xff0c; 服务器最近压力太大扛不住了&#xff0c;买了一台centos7.9的阿里云服务器准备进行迁移。具体操作日记如下。 一、安装宝塔面板 这一步涉及…

堡垒机软件详细定义以及部分厂商汇总

随着大家对网络安全的重视&#xff0c;越来越多的企业开始采购堡垒机。堡垒机可以分为硬件堡垒机、软件堡垒机、软硬一体机。今天我们就来聊聊堡垒机软件详细定义以及部分厂商汇总。 堡垒机软件详细定义 堡垒机软件&#xff0c;又称为运维安全审计系统&#xff0c;其主要功能在…

顺序表--数据结构第一关

顺序表 数据结构概念 定义&#xff1a;数据结构是计算机存储、组织数据的⽅式 根据学过C语言的基础上&#xff0c;数组是最简单的数据结构 顺序表的底层就是数组 为什么呢&#xff1f; 例子如下&#xff1a; int arr[100]{1,2,3,4,5}; //修改某一个数据&#xff1a;arr[…

【Docker】docker 替换宿主与容器的映射端口和文件路径

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 docker 替换宿主与容器的映射端口和文件夹 1. 正文 1.1 关闭docker 服务 systemctl stop docker1.2 找到容器的配置文件 cd /var/lib/docker/contain…