Codeforces Round 922 (Div. 2)补题

Brick Wall(Problem - A - Codeforces)

题目大意:规定砖的大小为1*k(k>=2),现在有一面n*m的砖墙,n是墙高,m是墙宽,砖在砖墙中有两种放法,水平放置和竖直放置,墙的稳定性=水平放置的砖的数量-竖直放置的砖的数量。现在要求墙的稳定性的最大值。注意墙不用填满,砖不能相交。

思路:很显然我们尽可能地水平放置,不竖直放置即可。反正又不用填满。

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;scanf("%d",&t);while(t--){int n,m;scanf("%d%d",&n,&m);m /= 2;n*=m;printf("%d\n",n);}
}

Minimize Inversions(Problem - B - Codeforces)

题目大意:现在有两个排列a,b,我们需要选择两个位置i,j,交换ai,aj和bi,bj,最后要使两个序列中的反转数最小。

思路:刚开始我看到这个题也没有什么头绪,然后就去分析了下样例,前两个样例没什么感觉,看到第三个样例的时候,我突然发现第三个样例的输出中第二个排列有序的。呀,昨晚上太着急了,以为它们是有序的,刚刚一看竟然不是,但是最后的结果确实是使一个排序变成有序的。不过我们还是来证明一下比较放心。

我们很容易通过交换使一个排列变成有序的,这样的话,两个排列中的反转数会是最小的吗?显然在有序的那个排列中反转数为0,那么在另一个序列中呢?哎,这个有点证不明白,但是写题解还是不要水,我去看了下官方的证明,思路大概是这样:

对于a,b我们选出来的i,j构成的逆序对数量为0,1,2,如果其中一个排列有序,那么另一个最多是1,这样对于这一对来说就是最优解,让某个序列全部排序,那么每一对都是最优的情况,那么就是最小的时候。

#include<bits/stdc++.h>
using namespace std;
int a[200010],b[200010];
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);vector<pair<int,int>>p;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);for(int i=1;i<=n;i++) p.push_back({a[i],b[i]});sort(p.begin(),p.end());for(int i=0;i<n;i++){int x=p[i].first,y=p[i].second;printf("%d ",x);}printf("\n");for(int i=0;i<n;i++){int x=p[i].first,y=p[i].second;printf("%d ",y);}printf("\n");}
}

XOR-distance(Problem - C - Codeforces)

题目大意:现有三个数a,b,r,我们需要在[0,r]中选一个数x,使得|(a^x)-(b^x)|最小,输出最小值。

思路:既然涉及到位运算,那么我们就从二进制的角度来看:

显然如果a,b在二进制的某一位相同,那么和x进行异或之后,还是相同的,所以没什么变化,那么我们要想最小化结果,肯定还是要从不同位入手,很明显如果一个为0,一个为1,那么如果是0作为被减数,那么就要从高位退1下来参与,所以我们肯定将最高位1在的那个数中二进制下为1,而另一个数二进制下为0的位置更改一下,另外第一个相异的位置不能改动,因为要从这里退位下来。那么问题就解决了。那么我们直接进行位运算即可,注意不要超过r。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{int t;scanf("%lld",&t);while(t--){int a,b,r;scanf("%lld%lld%lld",&a,&b,&r);if(a<b) swap(a,b);int flag=1;for(int i=60;i>=0;i--){int ta=(a>>i)&1,tb=(b>>i)&1;if(flag&&ta!=tb) {flag=0;continue;}if(!flag){if(ta==1&&tb==0) {if((1ll<<i)<=r) {r -= (1ll<<i);a ^= (1ll<<i);b ^= (1ll<<i);}}}}cout<<abs(a-b)<<endl;}
}

 Blocking Elements(Problem - D - Codeforces)

题目大意:现在有一个数组a[]和一个数组b[],我们要在a[]中将a[b[i]]的位置挑出来相加,剩下的以被挑走的位置为分隔,划出若干个区间,每个区间内部求和,这些和中的最大值作为结果,输出最小结果。举个例子:

思路:这里的结果肯定是在[1,sum]之内,所以想到二分,要快速求若干区间的和,那么想到预处理前缀和。现在最关键的问题就是二分的check函数怎么写。

我最初想的是就从头开始,一旦超过mid之后就以此划分,最后看挑出来的数是否小于mid,但是显然这个思路不可以。这么来看,我们第一次划分前的所有位置实际都可以作为第一次划分的位置,当然第二,第三次划分也是同理,那么就跟dfs联系起来了,对于搜每一次划分的位置。但是,显然时间复杂度太高了,这个题n的范围还有点大,那么就得换个思路。dfs简化就很容易想到动态规划,那么我们该如何动态规划呢?其实这里已经分析出了一个很重要的条件,每次划分的合法位置是一个区间,那么我们要想使结果最优,肯定是从这个区间中挑比较小的数加进结果。那么可以定义dp[i]表示以i位置为区间结尾,此时被挑选的数的和。因为我们在挑选的时候已经确定了每个区间的和是小于m的,进而来找划分位置,所以只要从这些合法的中找一个最小的即可。从一个区间中找最值,很容易想到滑动窗口,这里又是dp,那么就是单调队列优化dp的类型。还有一个问题,找合法区间的左端点时,是否必须从头开始找,显然不是,因为很容易可以发现,如果当前的i的左端点在j位置,那么后一个i的左端点一定是在j位置后面,因为我们确定区间只是通过区间和小于m来确定的。每一个值都是正数,那么区间和,区间一定不会再变长。所以我们只用看队列的开头是否需要弹出,来找合适的位置,因为队列是单增的,所以开头一定最小。

另外,结尾可能在任意位置,所以我们要循环判断一下。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int q[100010],a[100010],s[100010],dp[100010],hh,tt,n;
int check(int m)
{hh=0,tt=1;//数组模拟队列q[0]=0;for(int i=1;i<=n;i++){while(hh<tt&&s[i-1]-s[q[hh]]>m) hh++;dp[i]=dp[q[hh]]+a[i];while(hh<tt&&dp[q[tt-1]]>=dp[i]) tt--;q[tt++]=i;}for(int i=1;i<=n;i++)if(dp[i]<=m&&s[n]-s[i]<=m) return 1;return 0;
}
signed main()
{int t;scanf("%lld",&t);while(t--){scanf("%lld",&n);for(int i=1;i<=n;i++) scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];int l=1,r=s[n];while(l<r){int mid=(l+r)/2;if(check(mid)) r=mid;else l=mid+1;}printf("%lld\n",l);}
}

核心:虽然这道题既有区间和又有选点,但本质上考的是在限制区间的情况下求最小值,限制区间的条件比较隐蔽而已。 因为每一个划分的合法位置实际在一个区间中找,那么显然要找最小值,那么就是区间找最小值的问题,然后有多个位置,所以联系到单调队列优化的dp问题。

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

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

相关文章

Flink 读取 Kafka 消息写入 Hudi 表无报错但没有写入任何记录的解决方法

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

前端封装websocket类,实现消息注册和全局回调

实现消息注册和回调函数&#xff0c;实现全局使用同一个webscoket对象&#xff0c;并实现断线重连和心跳连接等功能&#xff0c;可以实现全局使用唯一实例&#xff0c;可以另外进行拓展配置 // WebSocket类对象 class WebSocketCli {// 构造函数constructor(url: string, opts…

北斗编码实现

本文根据北斗格网编码标注编写的测试代码, 北斗国标描述网址 http://c.gb688.cn/bzgk/gb/showGb?typeonline&hcno77B7EA113926D3247F9688324D4A91C8 我将北斗编码整理成一张图, 如下(代码在文末附上): #include "stdafx.h" #include <vector> #include &…

猫头虎博主第10期赠书活动:《写给大家看的Midjourney设计书》

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

Android 9.0 SystemServer进程读写sdcard权限的修改

1.前言 在9.0的系统rom定制化开发中,在一些系统进程中,也就是在SystemServer的进程中,其中系统服务中会要求读写Sdcard的一些功能,然后 默认是没有读取sdcard权限的,而在app中可以申请sdcard读写权限在系统服务中就不能申请权限,接下来看怎么授权实现sdcard授权 如图: 2…

ElementUI 组件:Container 布局容器

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 el-container.vue&#xff08;Container 布局容器&#xff09;页面效果图 项目里el-container.vue代码 <script> import PagePath from "/components/PagePat…

蓝桥杯嵌入式——省赛模板构建_lcd

在比赛时会给到资料包里面有LCD的驱动代码&#xff0c;我们只需copy到目标工程的bsp中间层来应用即可 打开Keil5&#xff0c;进行声明 初始化LCD屏幕 定义LCD专用减速变量和显示字符串变量 编写LCD执行子函数Lcd_proc()&#xff0c;用到sprintf函数

Go map 读写性能优化 - 分片 map

基本在所有的编程语言中&#xff0c;都有 map 这种数据结构&#xff0c;Go 语言也不例外。 我们知道 Go 是一门对并发支持得比较好的语言&#xff0c;但是 map 并不支持并发读写。 比如&#xff0c;下面这种写法是错误的&#xff1a; var m make(map[int]int) var wg sync.Wa…

如何下载52pojie、CSDN、简书、Myitmx、博客园的文章?(最新教程)

使用的油猴插件&#xff0c;具体怎么安装问一下度娘。 我用的火狐&#xff0c;点点点就行了&#xff0c;省事 先安装油猴拓展&#xff0c;启用一下 Tampermonkey – 下载 &#x1f98a; Firefox 扩展&#xff08;zh-CN&#xff09; 在安装插件 SaveToPDF 脚本安装后&#…

基于EdgeWorkers的边缘应用如何进行单元测试?

随着各行各业数字化转型的持续深入&#xff0c;越来越多企业开始选择将一些应用程序放在距离最终用户更近的边缘位置来运行&#xff0c;借此降低延迟&#xff0c;提高应用程序响应速度&#xff0c;打造更出色的用户体验。 相比传统集中部署和运行的方式&#xff0c;这种边缘应…

基于 NOVATEK NT98530 Multiview Stitching 应用解决方案

感测技术近来于影像监控系统应用有了进一步的发展&#xff0c;多镜头的应用也与日俱增&#xff0c;如 AI 视觉感测会议相机&#xff0c;能满足远端多人聚会、远距教育训练的多元需求等&#xff0c;相关应用层面广泛涵盖了在生活中所面对的各种场景&#xff0c;带动更加可观的潜…

#{}和${}的区别

#{}和${}的区别 .本质区别:使用注意事项防止SQL注入排序like查询 . 在使用mybatis操作数据库的时候,我们在编写sql语言的时候,会遇到一个问题,就是在传参的时候,有两个符号#,$.这两个符号有什么异同呢,接下来,我就会带着大家对这个问题进行简单的探讨 本质区别: #执行的是预编…

idea自动生成实体类

第一步&#xff1a;idea连接数据库 出现这个就连接成功 第二步&#xff1a;选择数据库 第三步&#xff1a;创建实体类 也可以点击数据库一下子全部创建 选择创建实体类所放位置 这样就完成了&#xff0c;点击看看对其做相应修改

RK3588平台开发系列讲解(视频篇)RKMedia的VDEC模块

文章目录 一、 VDEC模块支持的编码标准介绍二、VDEC API的调用三、VDEC解码流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKMedia是RK提供的一种多媒体处理方案,可实现音视频捕获、音视频输出、音视频编解码等功能。 一、 VDEC模块支持的编码标准介绍 RK3688 V…

【日常总结】MobaXterm session 如何迁移

一、场景 二、解决方案 三、实战 Stage 1&#xff1a;右键导出 Import sessions from file Stage 2&#xff1a;新MobaXterm软件中导入即可。Export all sessions to file 四、不足 一、场景 电脑更换&#xff0c;原电脑上MobaXterm中的20多个连接如何迁移 二、解决方案 …

如何判断 LM358 芯片是否损坏或故障?

LM358 芯片是一种流行的低功耗双运放&#xff0c;广泛应用于各种电子电路中&#xff0c;包括放大器、滤波器、积分器、比较器等。它以其低成本、高性价比和广泛的工作电源范围&#xff08;3V至32V单电源或1.5V至16V双电源&#xff09;而被广泛使用。 然而&#xff0c;像所有电…

十分钟学会用springboot制作微信小程序富文本编辑器

1.1 富文本模型设计 在构建富文本编辑器系统时&#xff0c;首先需要设计一个合适的富文本模型。 CREATE TABLE IF NOT EXISTS rich_texts (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),content TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );这个表包括…

如何在FBX剔除Lit.shader依赖

1&#xff09;如何在FBX剔除Lit.shader依赖 2&#xff09;Unity出AAB包&#xff08;PlayAssetDelivery&#xff09;模式下加载资源过慢问题 3&#xff09;如何在URP中正确打出Shader变体 4&#xff09;XLua打包Lua文件粒度问题 这是第371篇UWA技术知识分享的推送&#xff0c;精…

维护神经健康:新生儿补充维生素B12的注意事项

引言&#xff1a; 维生素B12是维持神经系统正常运作所必需的关键成分&#xff0c;对于新生儿的生长发育具有重要的作用。本文将深入探讨维生素B12的功能、新生儿补充的必要性&#xff0c;以及在补充维生素B12时应该注意的事项&#xff0c;以为父母提供科学、全面的育儿指南。 …

springCloud gateway 防止XSS漏洞

springCloud gateway 防止XSS漏洞 一.XSS(跨站脚本)漏洞详解1.XSS的原理和分类2.XSS漏洞的危害3.XSS的防御 二.Java开发中防范XSS跨站脚本攻击的思路三.相关代码&#xff08;适用于spring cloud gateway&#xff09;1.CacheBodyGlobalFilter.java2.XssRequestGlobalFilter.java…