Codeforces Round 930 (Div. 2)题解

A. Shuffle Party(Problem - A - Codeforces)

题目大意:给定一个n长数组,并使得a[i]=i,现在定义一种操作swap(k):找出k的最大不等于自己的除数d,交换a[k]和a[d],k从1开始直到n结束,问最后结束的时候1在哪里。

思路:这题的交换看似比较混乱,但是我们如果只盯着1的位置就会发现规律。1可以换到位置2,而位置2只能换到位置4,位置4换到位置8,...,所以实际上我们只要找到n在二进制下最高位1即可。

n在1e9的范围内,我们可以从30开始循环,往低位找。(注意int的数据范围在2^31-1的范围内,所以也就是说int类型的数最多31位,如果从32开始循环就会出现错误)

有两个二进制处理:

获取n的第i位是否是1,判断n>>i&1是否为1,如果为1,就说明n的第i位为1,否则就是0.
将最高位1后面的全部换成0:n>>i<<i,假设n的最高位1在第i位。

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);int flag=1;for(int i=30;i>=0;i--){if(n>>i&1) {flag=n>>i<<i;break;}}printf("%d\n",flag);}
}

 B. Binary Path(Problem - B - Codeforces)

题目大意:现在有一个2行m列的方格阵,每个格子中的值是0或1,我们要从(1,1)到(2,n),每次只能向右或者向下移动一格,问字典序最小的移动方案数。

思路:这题我第一反应就是数字三角形模型+背包问题统计方案数,但也正是因为这个走入了误区,因为很显然这里是每个格子是不能将其中的数视为权重的,如果将0和1视为权重,那么就会出现两种字典序不同的方案最后的花费相同,很显然不符合题意,但是由于我没有跳出第一映像重新分析,就非得找到一个合适的dp的方法,绕来绕去最后实在没辙跑去看第三题了,浪费了不少时间,最后写出来的时候没卡上点。

这题和一般的dp问题不同,因为只能向右或者向下走,所以一旦向下走了就只能向右走了,剩下的步数就只有一种选择了,所以问题的核心在于什么时候向下走。

当我们还在上面的时候,每一步实际面临两种选择,一种是向右走,一种是向下走,字典序相同的时候方案不同那么我们看一下为什么会出现这种情况:

如图,如果三条路径对应的字典序相同,那么标号相同的位置的值必须相同。所以实际上我们只需要找出这样的一段区间即可。那么该怎么找呢,我们可以直接比较这样的格子,也可以比较上面一行向右和向下对应的两个格子是否相等。这里采用第二种方法,因为对输出序列友好一些,然后我们来看具体如何统计:

如果两步操作对应的格子的数是一样的,那么实际上是无所谓的,如果右边是0,下面是1,那么必须向右,前面已经统计的向右向下相等的位置的数目必须作废,如果右边是1,下面是0,那么必须向下,后面的讨论也就没有意义了。所以实际上我们只用一格一格往后找,当向右向下相同的时候计一下数,当两者不同,向右为0的时候重新计数,向下为0的时候直接退出。然后还有一点需要考虑,我们需要输出最后的序列,所以还要统计相等的那一段区间。

#include<bits/stdc++.h>
using namespace std;
char s[3][200010];
int dp[3][200010];
int n;
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=2;i++) scanf("%s",s[i]+1);int c=0,i,l=0,r=0;for(i=1;i<n;i++){if(s[1][i+1]==s[2][i]) c++,r++;else if(s[1][i+1]>s[2][i]) break;else c=0,r=l=i+1;}if(i<=n){for(int j=1;j<=i;j++) printf("%c",s[1][j]);for(int j=i;j<=n;j++) printf("%c",s[2][j]);}else{printf("%s",s[1]+1);printf("%c",s[2][n]);}printf("\n%d\n",c+1);}
}

C. Bitwise Operation Wizard(Problem - C - Codeforces)

题目大意:这题是交互题,实际上想让我们实现的是,通过询问若干次a|b与c|d的大小,进而找出异或值最大的两个数。

思路:这题也是我最开始的分析太过片面了,我只考虑了高位1,两个数的异或值大就说明两个数高位是不同的,a|b>c|d,就说明我们可以从a,b中选一个实际生效的数,从c,d中选一个没在|运算高位1中生效的数,然后就此推断出找出最大值和最小值进行异或,但是我忽略了1111111101,01,10这种情况。这种情况下显然选01不如选10。那么这道题该如何考虑呢?

我们还是想办法从这道题的特殊的地方入手,题目中给的数组是一个排列,从0到n-1的排列,那么最大的数显然是n-1,然后要找出n-1为0的哪些位置为1的数,显然两者进行|运算的值应该最大,但是如果仅仅是找或运算的话,那么n-1为1的位置,且找到的数对应位置也为1的位置的那种值如何排除呢,显然我们的目标值中1的个数最少,目标值为1的位置所有找到的值对应的位置应该也是1,但是应该比目标值大。所以就要找到所以值中最小的一个。比较两个数的大小可以通过询问a,a,b,b来得到。

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);if(n==2){printf("! 0 1\n"),fflush(stdout);}else{char op[2];int mx=0,mi=0;//找最大值for(int i=1;i<n;i++){printf("? %d %d %d %d\n",mx,mx,i,i),fflush(stdout);scanf("%s",op);if(op[0]=='<') mx=i; }for(int i=1;i<n;i++){printf("? %d %d %d %d\n",mx,mi,mx,i),fflush(stdout);scanf("%s",op);if(op[0]=='<') mi=i;else if(op[0]=='=') {printf("? %d %d %d %d\n",mi,mi,i,i),fflush(stdout);scanf("%s",op);if(op[0]=='>') mi=i;} }printf("! %d %d\n",mx,mi),fflush(stdout);}}
}

D. Pinball(Problem - D - Codeforces)

题目大意:有一排格子,每个格子中只有'<'和'>'两种字符,有一个小球被放入了第i个格子,如果格子中是'<'那么小球下一秒就会往左移动一格,同时当前格子的字符变成'>',另一种字符同理,问小球放在每个格子的时候离开格子需要多少秒。(1<=n<=5e5)

思路:如果可以模拟的话显然这题不太难,但是n的数据范围太大了,而且还有多组测试样例,很显然不能通过模拟来写,那么就要找一下规律了。

我们先只来看相邻的两个格子,而且将小球放在第一个格子处,

如果是>>,直接向右两步

如果是<<,直接向左一步

如果是><,向右一步,向左两步

如果是<>,直接向左一步。

很显然对于同向的格子可以一直沿着这个方向往前,对于反向的格子>>>><,第一次走到反向位置时,会发现已经变成了<<<<<,所以又可以一直往左。

><<<>>><

>>>>>>><

<<<<<<<<

<<<>>><

抽象一下,如果走到反向位置后,相当于可以将反向位置同化,最后至少有一端是全部被同向化了。起始方向的方向需要统计反向的个数,起始反向的方向需要统计同向个数

统计位置和(下标和处理一下)与个数

两个方向都统计一下

如果是>的话,那么要么左右阻碍个数相同,从右边出,要么左边的阻碍比右边少1个,从左边出

如果是<的话,要么左右阻碍个数相同,从左边出,要么右边的阻碍比左边少1个,从右边出

多余的阻碍可以不用考虑。

>:

cntl[i]>=cntr[i]:左右各考虑最近的cntr[i]个阻碍

cntl[i]<cntr[i]:左边考虑cntl[i]个阻碍,右边考虑最近的cntl[i]+1个阻碍

<:

cntl[i]<=cntr[i]:左右各考虑最近的cntl[i]个阻碍

cntl[i]>cntr[i]:右边考虑cntr[i]个阻碍,左边考虑最近的cntr[i]+1个阻碍,

倒是可以用单调队列统计,

看上去要实现对应位置的查找很麻烦,但实际上我们可以用前缀和+二分的思想来实现。

尽管如此细节处理还是很麻烦。

#include<bits/stdc++.h>
using namespace std;
#define int long long
char s[500010];
int l[500010],r[500010];
int cntl[500010],cntr[500010];
signed main()
{int t;scanf("%lld",&t);while(t--){int n;scanf("%lld",&n);scanf("%s",s+1);for(int i=1;i<=n;i++){if(s[i]=='>'){cntl[i]=cntl[i-1],cntr[i]=cntr[i-1]+1;l[i]=l[i-1],r[i]=r[i-1]+i;}else//<{cntl[i]=cntl[i-1]+1,cntr[i]=cntr[i-1];l[i]=l[i-1]+i,r[i]=r[i-1];}}int ans;for(int i=1;i<=n;i++){if(s[i]=='>'){//右边的<     左边的> if(cntl[n]-cntl[i]<=cntr[i-1])//从右边出,那么左边的>不会用完{//找到左边第cntl[n]-cntl[i]个>int x=cntl[n]-cntl[i];int xl=1,xr=i-1,p=xl;if(x==0) p=i;//这里会出现为0的情况else{while(xl<xr){int mid=(xl+xr)/2;if(cntr[i-1]-cntr[mid-1]<x) xr=mid-1;else if(cntr[i-1]-cntr[mid-1]>x) xl=mid+1;else xl=xr=mid;}p=xl;}//[mid,i-1]这个区间中的>ans=2*(l[n]-l[i]-x*i) + 2*(x*i-(r[i-1]-r[p-1])) + (n-i+1);}else//从左边出,需要获得右边第cntr[i-1]+1个<的位置{int x=cntr[i-1]+1;int xl=i+1,xr=n,p=xl;while(xl<xr){int mid=(xl+xr)/2;if(cntl[mid]-cntl[i]<x) xl=mid+1;else if(cntl[mid]-cntl[i]>x) xr=mid-1;else p=xl=xr=mid;}p=xl;ans = 2*(i*cntr[i-1]-r[i-1])+2*(l[p]-l[i]-(cntl[p]-cntl[i])*i)+i;}}//><<else//<{//左边的> 右边的<if(cntr[i]<=cntl[n]-cntl[i])//从左边出{//获取右边第cntr[i]个<的位置int x=cntr[i];int xl=i,xr=n,p=xl;while(xl<xr){int mid=(xl+xr)/2;if(cntl[mid]-cntl[i]<x) xl=mid+1;else if(cntl[mid]-cntl[i]>x) xr=mid-1;else p=xl=xr=mid;}p=xl;ans=2*(x*i-r[i])+2*(l[p]-l[i]-x*i)+i;}else//从右边出,这里不会出现某种值为0的情况{//找左边第cntl[n]-cntl[i]个>的位置int x=cntl[n]-cntl[i]+1;int xl=1,xr=i-1,p=xl;while(xl<xr){int mid=(xl+xr)/2;if(cntr[i-1]-cntr[mid-1]<x) xr=mid-1;else if(cntr[i-1]-cntr[mid-1]>x) xl=mid+1;else p=xl=xr=mid;}p=xl;ans = 2*(x*i-(r[i-1]-r[p-1]))+2*(l[n]-l[i]-i*(x-1))+n-i+1;}}printf("%lld ",ans);}printf("\n");}
}

总结:b,c两道题都给了一个启示,看到题目先从普遍的情况去思考,当卡住的时候,不要咬死不放,想办法从这道题目特殊的地方再去思考一下。d题的启示在于从某个范围中紧邻的第x个符合要求的数的时候可以考虑前缀和+二分来实现。

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

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

相关文章

Tomcat部署Web服务器及基础功能配置

前言 Tomcat作为一款网站服务器&#xff0c;目前市面上Java程序使用的比较多&#xff0c;作为运维工人&#xff0c;有必要了解一款如何去运行Java环境的网站服务。 目录 一、Java相关介绍 1. Java历史 2. Java跨平台服务 3. Java实现动态网页功能 3.1 servelt 3.2 jsp …

【论文笔记】Improving Language Understanding by Generative Pre-Training

Improving Language Understanding by Generative Pre-Training 文章目录 Improving Language Understanding by Generative Pre-TrainingAbstract1 Introduction2 Related WorkSemi-supervised learning for NLPUnsupervised pre-trainingAuxiliary training objectives 3 Fra…

Doris实战——金融壹账通指标中台的应用实践

目录 前言 一、业务痛点 二、早期架构挑战 三、架构升级 四、一体化指标数据平台 4.1 构建指标体系 4.2 构建指标平台功能 五、Doris指标应用实践 六、未来规划 原文大佬的这篇指标中台的应用实践有借鉴意义&#xff0c;这里摘抄下来用作学习和知识沉淀。 前言 在搭建…

鸿蒙Harmony应用开发—ArkTS声明式开发(点击事件)

组件被点击时触发的事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 onClick onClick(event: (event: ClickEvent) > void) 点击动作触发该回调。 卡片能力&#xff1a; 从API version 9开始…

Acwing---883. 高斯消元解线性方程组

高斯消元解线性方程组 1.题目2.基本思想3.代码实现 1.题目 输入一个包含 n 个方程 n 个未知数的线性方程组。 方程组中的系数为实数。 求解这个方程组。 下图为一个包含 m 个方程 n 个未知数的线性方程组示例&#xff1a; 输入格式 第一行包含整数 n。 接下来 n n n 行…

day09_面向对象_构造方法_封装

今日内容 零、 复习昨日 一、构造方法 二、重载 三、封装 零、 复习昨日 1 类和对象是什么关系? 类是模板(原材料)对象是具体实例(成品)类创建出对象 2 类中有什么?(类的成员) 成员属性(成员变量), 成员方法 3 创建对象的语法? 类名 对象名 new 类名(); 4 调用对象属性,方法…

欧拉-黎曼函数的K阶近似(OpenMP实现和MPI实现)

目录 欧拉-黎曼函数的K阶近似&#xff08;OpenMP实现和MPI实现&#xff09;问题描述OpenMP代码实现MPI代码实现 注意事项运行参考资料 欧拉-黎曼函数的K阶近似&#xff08;OpenMP实现和MPI实现&#xff09; 问题描述 OpenMP代码实现 #include <stdio.h> #include <s…

网站开发--Cookie 和 Session 的工作流程

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–Cookie 和 Session 的工作流程 一.Cookie和Session的基本概念 前言:HTTP协议是无状态协议 无状态协议就是指HTTP协议在传输的过程中不会保存上一次交互的状态信息,但是…

CrossOver 24下载-CrossOver 24 for Mac下载 v24.0.0中文永久版

CrossOver 24是一款可以让mac用户能够自由运行和游戏windows游戏软件的虚拟机类应用&#xff0c;虽然能够虚拟windows但是却并不是一款虚拟机&#xff0c;也不需要重启系统或者启动虚拟机&#xff0c;类似于一种能够让mac系统直接运行windows软件的插件。它以其出色的跨平台兼容…

Qt应用软件【测试篇】vargrid内存检查工具

文章目录 vargrid介绍vargrid官网vargrid安装常用命令Valgrind的主要命令vargrid介绍 Valgrind是一个用于构建动态分析工具的框架,能自动检测许多内存管理和线程错误,并详细分析程序性能。Valgrind发行版包括七个成熟工具:内存错误检测器、两个线程错误检测器、缓存和分支预…

、JMETER与它的组件们

os进程取样器 这个取样器可以让jmeter直接调用python写的测试数据 这样就可以调用python写的测试数据给到jmeter进行调用 注意&#xff1a;1建议python返回转json格式dumps一下&#xff1b;2py文件中需要把结果打印出来&#xff0c;可以不用函数直接编写 传到jmeter之后可以用…

【前端素材】推荐优质在线电影院商城电商网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上浏览电影资源、租借或购买电影&#xff0c;以及观看在线影片。 2、功能需求 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上…

作业1-224——P1331 海战

思路 深搜的方式&#xff0c;让它只遍历矩形块&#xff0c;然后在下面的遍历中判断是否出现矩形块交叉&#xff0c;但是很难实现&#xff0c;然后发现可以通过在遍历过程中判断是否合法。 参考代码 #include<iostream> #include<cstdio> using namespace std; …

【算法 - 动态规划】划分整数Ⅰ

在前面的动态规划系列文章中&#xff0c;关于如何对递归进行分析的四种基本模型都介绍完了&#xff0c;再来回顾一下&#xff1a; 从左到右模型 &#xff1a;arr[index ...]从index 之前的不用考虑&#xff0c;只考虑后面的该如何选择 。范围尝试模型 &#xff1a;思考 [L ,R]…

【Web】青少年CTF擂台挑战赛 2024 #Round 1 wp

好家伙&#xff0c;比赛结束了还有一道0解web题是吧( 随缘写点wp(简单过头&#xff0c;看个乐就好) 目录 EasyMD5 PHP的后门 PHP的XXE Easy_SQLi 雏形系统 EasyMD5 进来是个文件上传界面 说是只能上传pdf&#xff0c;那就改Content-Type为application/pdf&#xff0c;改…

【学习记录】Resnet

Resnet的残差块 BasicBlock模块&#xff1a; Resnet的作用 解决梯度消失。网络越深&#xff0c;会导致梯度消失。Resnet可以解决梯度消失的问题。 Resnet的原理 参考视频&#xff1a;https://www.bilibili.com/video/BV1cM4y117ob/?spm_id_from333.337.search-card.all.cl…

unity后期

unity|后处理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后处理效果 抗锯齿①、Ambient Occlusion 环境光遮蔽②、Auto Exposure 自动曝光③、Bloom 辉光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色调/颜色分级⑥、Depth Of Fiel…

css5定位

css 一.定位1.概念&#xff08;定位定位模式边位移&#xff09;2.静态位移static&#xff08;不常用&#xff09;3.相对定位relative&#xff08;不脱标&#xff09;&#xff08;占位置&#xff09;4.绝对定位absolute&#xff08;脱标&#xff09;&#xff08;不占位置&#x…

内网搭建mysql8.0并搭建主从复制详细教程!!!

一、安装mysql 1.1 mysql下载链接&#xff1a; https://downloads.mysql.com/archives/community/ 1.2 解压包并创建相应的数据目录 tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local cd /usr/local/ mv mysql-8.2.0-linux-glibc2.28-x86_64/ mysql mkdir…

模型选择与评估

&#x1f6a9; 机器学习的一般流程包括&#xff1a;数据集的准备与预处理、搭建模型、模型训练、模型评估与应用。 在现实任务中&#xff0c;我们往往有多种学习算法可供选择&#xff0c;甚至对同一个学习算法&#xff0c;当使用不同的参数配置时&#xff0c;也会产生不同的模型…