Codeforces Round 887 Div.3 A~D

news2025/1/22 21:41:05

文章目录

    • A. Blackboard List
    • B. Minimize Permutation Subarrays
    • C. No Prime Differences
    • D. Bracket Walk

A. Blackboard List

Problem - A - Codeforces
image.png

一个只有两个数的数组,选择数组中的任意两个数,计算它们差值的绝对值并加入数组
给定一个长度为n的数组,该数组经过了n-2次以上操作,问原数组中的数?(输出两个中的任意一个)

由于加入数组的数都是正数,所以数组中的负数一定是原数
若数组中的数都是正数,由于每次计算的都是两者之间差值的绝对值,该值一定小于两数中较大的数。所以数组中最大的数一定是原数

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 110;
int T, n, a[N];

int main()
{
    cin >> T;
    while ( T -- )
    {
        cin >> n;
        for (int i = 0; i < n; ++ i ) cin >> a[i];
        int mn = *min_element(a, a + n);
        int mx = *max_element(a, a + n);
        if (mn < 0) cout << mn << endl;
        else cout << mx << endl;
    }
    return 0;
}

B. Minimize Permutation Subarrays

Problem - B - Codeforces
image.png

对于长度为n的数组,若数组中的数分别是1~n中的所有数,那么该数组为n的全排列
给定长度为n的全排列,交换数组中的两个数,使得数组的子数组中,全排列数量最小

根据全排列的性质,1. 数组中的数不能重复,由于原数组本身就是全排列,所以其子数组中不会出现重复的数,故无法往这个方向构造。2. 长度为n的数组中不可能出现大于等于n+1的数,根据这个性质,我们可以构造一种情况,使得子数组出现n或者大于子数组长度的数
继续考虑,长度大于2的全排列中,一定会出现1与2。由于子数组必须是连续的这个性质,原数组1到2之间的所有数必须被包含

比如:1 3 2 5 4,前三个数构成的子数组1 3 2是一个全排列,其长度大于2,那么一定会包含原数组中1到2之间的数。而1到2之间的数为3,是一个小于等于数组长度的数,若1到2之间的数为一个大于数组长度的数,比如1 4 2 5 3或者1 5 2 3 4,前三个数构成的子数组不再是全排列

所以,无论如何选取子数组,子数组中一定有两个子数组是全排列,它们的长度为1和n。剩下的子数组,我们需要构造一种情况,使得原数组的1到2之间存在大于子数组长度的数。要使所有子数组的全排列数量最小,将n放入1到2之间,此时原数组的所有子数组中只存在两个全排列

因此,这道题的做法是:找出1,2和n的位置,若n不在1和2之间,将n与1(或2)交换
a [ i ] a[i] a[i]作为p数组的下标,用p数组存储 a [ i ] a[i] a[i]在a数组中的下标,即 p [ a [ i ] ] = i p[a[i]] = i p[a[i]]=i
最后将1,2,n三者的下标进行排序,输出n的下标与中间的下标

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 2e5 + 10;
int T, a[N], p[N], n;

int main()
{
    cin >> T;
    while ( T -- )
    {
        cin >> n;
        int i1, i2, in;
        for (int i = 1; i <= n; ++ i ) 
        {
            cin >> a[i];
            p[a[i]] = i;
        }
        
        int b[] = { p[1], p[2], p[n] };
        sort(b, b + 3);
        cout << b[1] << ' ' << p[n] << endl;
    }
    return 0;
}

参考了灵神的思路与代码,对比自己的代码后,不得不说,灵神的代码是真的简洁


C. No Prime Differences

Problem - C - Codeforces
image.png

给定矩阵的n和m,矩阵中的数为1~ n ∗ m n*m nm,构造一个矩阵,使得(上下左右)相邻的数,绝对值为非质数
矩阵的构造一般有几种:1. 横着构造 2. 竖着构造 3. 斜着构造 4. 染色构造(每次构造不相邻的格子)
这题可以横着构造,若n为4,m为4,先构造第一行1 2 3 4,这样一行中的每个数相差1,满足题意
再构造剩余行:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
每一列中,相邻元素相差4,满足题意。若交换每一行的位置,矩阵依然满足题意,因为每一列相邻元素的差值为m的倍数,m为非质数,其倍数一定是非质数。若m为质数,其两倍以上的数才是非质数
若n为4,m为5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
每一行中的相邻元素相差1,满足题意,每一列的相邻元素相差5,不满足题意。考虑行的交换
11 12 13 14 15
1 2 3 4 5
16 17 18 19 20
6 7 8 9 10
此时满足题意,若m和n都为5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
交换:
1 2 3 4 5
11 12 13 14 15
21 22 23 24 25
6 7 8 9 10
16 17 18 19 20
可以发现,当m为质数时,要使每一列的相邻元素相差非质数,这个差值必须是m的两倍或者两倍以上
也就是将:奇数行变成相邻行,偶数行变成相邻行,使得矩阵的上一半为原来的奇数行,下一半为原来的偶数行
此时矩阵的两部分都满足题意,但是上半部分和下半部分的相邻行,如果本来就是相邻行呢?如:
1 2 3 4 5
11 12 13 14 15
6 7 8 9 10
16 17 18 19 20
11所在行与6所在行本来就是相邻行,此时矩阵中只有这两行不满足题意。将奇数行的第一行1与偶数行的最后一行16作为相邻行,那么一定满足题意
6 7 8 9 10
16 17 18 19 20
1 2 3 4 5
11 12 13 14 15
即,交换上下两个部分,偶数行在上,奇数行在下

综上,这题的构造方式是:

  1. 从左往右,从上往下,将1~n*m填入格子,此时行中的相邻元素满足题意,考虑列的构造
  2. 将偶数行作为矩阵的上半部分,奇数行作为矩阵的下半部分
#include <iostream>
using namespace std;

const int N = 1010;
int a[N][N];
int T, n, m;

int main()
{
    cin >> T;
    while ( T -- )
    {
        cin >> n >> m;
        for (int i = 1, x = 1; i <= n; ++ i )
            for (int j = 1; j <= m; ++ j )
                a[i][j] = x ++ ;
        
        for (int i = 2; i <= n; i += 2)
        {
            for (int j = 1; j <= m; ++ j )
                cout << a[i][j] << ' ';
            cout << endl;
        }
        for (int i = 1; i <= n; i += 2)
        {
            for (int j = 1; j <= m; ++ j )
                cout << a[i][j] << ' ';
            cout << endl;
        }
    }
    return 0;
}

D. Bracket Walk

Problem - D - Codeforces
image.png

给定一个之包含1和-1的序列,从左到右走完这个序列,在不越界的情况下,每一步可以向左或向右走。将走过位置的数值累加,即 s u m + = a [ i ] sum += a[i] sum+=a[i],满足sum始终大于等于0,并且最后为0

问:将某个位置的数改为相反数后,是否满足题意?
判断YES或NO的题,先考虑NO的情况
若数组长度为奇数,那么sum最后的值一定不为0,输出NO

由于这题能往回走,考虑出现连续的1或者-1时,往回走1次对sum的影响
若出现k个连续的1,往回走1次,sum += (k - 2) * 2 + 2
若出现k个连续的-1,往回走1次,sum += (k - 2) * -2 + -2
所以只要k大于等于2,不论往回走几次,对sum的影响为一个偶数的变化,且最少变化2或-2

只要出现了连续的1,那么sum就能达到正无穷,只要连续的1之后存在连续的-1,那么sum就能回到0。所以连续1和连续-1之间的情况不需要考虑,因为无论情况怎样,最后都一定是0。所以只要保证连续1之前与连续-1之后,序列由( )组成。若出现( ))或者(( ),则视为不合法

那如何用代码实现呢?实现方式很巧妙,之前自己写了三份不同的,一大堆ifelse条件判断,依然是漏了一些情况。心态崩了,只好借鉴灵神的思路
假设用字符串保存括号序列,从0下标开始。规定偶数下标必须保存(,奇数下标必须保存),即序列()()()()...。若真实序列的偶数下标保存),那么记录该下标,同理,真实序列的奇数下标保存(,也记录该下标
所以,被记录的下标中,偶数下标为),奇数下标为(。若最小值为奇数下标,并且最大值为偶数下标,说明真实序列中先出现((最后出现)),此时序列合法
若最小值与最大值都为偶数下标,说明真实序列中,第一次出现的连续括号与最后一次出现的连续括号都是)),显然不合法
若最小值与最大值都为奇数下标,说明真实序列中,第一次出现的连续括号与最后一次出现的连续括号都是)),也同样不合法

由于被记录的下标中,要取出最大与最小值,并且每次的询问操作还是叠加的,这里用set保存被记录的下标,begin()和人begin()返回的就是最小与最大值。每次判断要反转的括号是否在set中,若不在,则说明该下标上的括号原本是正确的,反转后将该下标加入set,若存在,将该下标从set中删除

#include <iostream>
#include <set>
using namespace std;

const int N = 2e5 + 10;
char str[N];
int n, q;
set<int> s;

int main()
{
    cin >> n >> q >> str;
    char a[3] = "()";
    for (int i = 0; i < n; ++ i )
        if (str[i] != a[i & 1])
            s.insert(i);

    while ( q -- )
    {
        int x;
        cin >> x;
        if (s.count(-- x)) s.erase(x);
        else s.insert(x);
        
        if (n & 1) cout << "NO" << endl;
        // 最小的是右括号(偶数),最大的是左括号(奇数)
        else if (s.size() && ((*s.begin() % 2 == 0) || (*s.rbegin() % 2))) cout << "NO" << endl;
        else cout << "YES" << endl;
    }
    return 0;
}

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

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

相关文章

计算机竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …

二级MySQL(六)——表格数据插入

1、插入完整的数据记录&#xff1a; INSERT INTO tb_student VALUES(2014210103,王玲,女,1998-02-21,安徽,汉,CS1401); 结果&#xff1a; 2、插入指定位置的数据&#xff1a; 直接输入是错的&#xff1a; 需要指出插入的列名称&#xff1a; 结果&#xff1a; 中间两列允许输入…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 等等开头

不与世俗为伍。哪怕这是自己许给自己的诅咒。 —— 宫崎骏 《红猪》 最近&#xff0c;在使用最新版的AndroidStudio打开一个两年前的项目时候&#xff0c;报了一个如下的错误&#xff1a;【cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容】。应以 ‘…

基于PyTorch框架下网络模型的使用与修改

目录 1 损失函数和反向传播1.1 损失函数1.2 反向传播 2 优化器3 现有网络模型的使用及修改4 网络模型的保存与读取4.1 网络模型的保存4.2 网络模型的读取&#xff08;加载&#xff09; 5 完整的模型训练套路6 利用GPU训练模型7 完整的模型验证套路&#xff1a; 1 损失函数和反向…

基于DolphinScheduler的调度流程梳理及落地实践

目 录 01 背景‍ 02 主流调度引擎 ‍‍‍‍‍‍‍ 03 DolphinScheduler核心概念及调度过程‍‍‍‍‍‍ 04 开发实践 01‍ 背景‍‍ 随着数据中台概念及相关技术逐渐成熟、落地&#xff0c;不断有企业将其应用到自身业务中&#xff0c;将原本分散的各系统数据进行整合、分析…

【FAQ】安防监控视频汇聚平台EasyCVR接入GB国标设备,无法显示通道信息的排查方法

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

http协议与apache

http概念&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念 万维网&#xff1a;万维网并非某种特殊的计算机网络&#xff0c;是一个大规模的、联机式的信息贮藏库&…

【前端从0开始】JavaSript——Date对象

创建Date对象 var dateObjnew Date(); 方法 将日期转为字符串 toLocaleString() toLocaleDateString() toLocaleTimeString()获取年、月、日、小时、分、秒 ○1&#xff09;getYear() //两位的年(2000年前)或三位的年[1900] 获取两位数的年&#xff0c;从1900年开始计算&…

硬件知识积累 USB 接口 type - A type - B type - C 的介绍与功能说明 (简单介绍)

1. USB 的介绍 1.1 USB 的定义 USB : 通用串行总线(英语: Universal Serial Bus&#xff0c;缩写:USB)是一种串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通讯产品&#xff0c;并扩展至摄影器材、数字电视&a…

第四节 C++ 选择结构

文章目录 前言介绍1. if 选择结构1.1 概述1.2. 单 if 语句执行1.2.1 分号和中括号注意事项1.2.2 案例&#xff1a;判断天气 1.3. if - else 语句结构1.3.1 案例1&#xff1a;考试成绩1.3.2 案例2&#xff1a;判断闰年1.3.3 案例3&#xff1a;判断三角形 1.4. 多分支结构1.4.1 语…

VIT Swin Transformer

VIT&#xff1a;https://blog.csdn.net/qq_37541097/article/details/118242600 Swin Transform&#xff1a;https://blog.csdn.net/qq_37541097/article/details/121119988 一、VIT 模型由三个模块组成&#xff1a; Linear Projection of Flattened Patches(Embedding层) Tran…

linux服务TCP参数配置

Linux TCP参数配置 阿里云规范 1.【推荐】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。 说明&#xff1a;操作系统默认 240 秒后&#xff0c;才会关闭处于 time_wait 状态的连接&#xff0c;在高并发访问下&#xff0c;服务器端会因为处于 time_wait 的连接数太多&am…

创邻科技张晨:图数据库,激活数据要素的新基建

“数据经济时代&#xff0c;数据要素产业链的各细分领域均蕴含机遇&#xff0c;图技术作为网络协同和数据智能的底层发动机&#xff0c;将深度掘金数字中国价值潜能”。 8月22日&#xff0c;在2023中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会的信息技术…

构建 NodeJS 影院预订微服务并使用 docker 部署(04/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 我们前几章的快速回顾 第一篇文章介绍了微服务架构模式&#xff0c;并讨论了使用微服务的优缺点。第二篇…

L1-033 出生年 测试点全过

题目 以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不…

汽车制造业外发文件时 如何阻断泄密风险?

汽车制造业是我国国民经济发展的支柱产业之一&#xff0c;具有产业链长、关联度高、就业面广、消费拉动大等特性。汽车制造行业景气度与宏观经济、居民收入水平和固定资产投资密切相关。 汽车制造业产业链长&#xff0c;关联度高&#xff0c;汽车制造上游行业主要为钢铁、化工…

VScode中写Verilog时,iverilog语法自动纠错功能不起作用

VScode中编写Verilog时&#xff0c;iverilog语法自动纠错功能不起作用 问题&#xff1a;按照教程搭建vscode下Verilog编译环境&#xff0c;发现语法纠错功能一直无效&#xff0c;检查了扩展Verilog-HDL/SystemVerilog/Bluespec SystemVerilog的配置也没有任何问题。 错误原因&a…

【前端从0开始】JavaSript——Array对象

Array对象 导语&#xff1a;页面中的数据&#xff0c;都是从数据库读取出来的&#xff0c;如果返回的数据多&#xff0c;一般情况下会以数组或者对象的形式来进行返回&#xff0c;如果想要删除或者添加数据&#xff0c;就可以使用数组中的方法 如图所示&#xff0c;我们可以通…

RE:从零开始的车载Android HMI(四) - 收音机刻度尺

最近比较忙&#xff0c;研究复杂的东西需要大量集中的时间&#xff0c;但是又抽不出来&#xff0c;就写点简单的东西吧。车载应用开发中有一个几乎避不开的自定义View&#xff0c;就是收音机的刻度条。本篇文章我们来研究如何绘制一个收音机的刻度尺。 本系列文章的目的是在讲…