AtCoder Regular Contest 182

news/2024/11/13 9:05:09/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18354853

原来第二题比第一题简单吗😢

A.Chmax Rush! \(\texttt{Diff 1110}\)

给定三个序列 \(S,P,V\),其中 \(S\) 的长度为 \(N\)\(P,V\) 的长度为 \(Q\),按从小到大的顺序对每个 \(i\in[1,Q]\) 执行下述操作:

\([1,P_{i}]\)\([P_{i},N]\) 中选择一个区间,要求其中所有的值都不大于 \(V_{i}\),然后将区间内所有值替换成 \(V_{i}\)

求出能在符合要求的情况下执行全部操作的方案数

\(N,Q\le 5000\)

Hint

离线下来倒序做

Solution

考虑到可以倒序做这个题.

假设现在我们枚举到了操作 \(i\),那么,对于它前面的每一个操作 \(j\),假如 \(V_{i}\lt V_{j}\),显然这两个操作就不能有重复区间了. 那么如何才能让它们之间没有重复区间?分以下情况讨论:

  • \(P_{i}\lt P_{j}\),为了无交集,应该选 \([1,P_{i}],[P_{j},N]\) 两个区间

  • \(P_{i}\gt P_{j}\) 同理,选 \([1,P_{j}],[P_{i},N]\) 两个区间

  • \(P_{i}=P_{j}\),无论如何选总会在 \(P_{i}\) 相交,直接判无解

因此此题可以 \(n^{2}\) 做,鉴于单次操作可能的状态只有两个,因此记录一下谁放右边,谁放左边就行了. 最后加起来一乘就是答案.

Code
int n,q,p[5001],v[5001],s[5001],ans=1;
const int mod=998244353;
bool isleft[5001],isright[5001];
int main(){read(n,q);for(int i=1;i<=q;++i){read(p[i],v[i]);isleft[i]=isright[i]=true;}for(int i=q;i>=1;--i){for(int j=i-1;j>=1;--j){if(v[i]<v[j]){if(p[i]>p[j]){isleft[i]=false;isright[j]=false;}else if(p[j]>p[i]){isright[i]=false;isleft[j]=false;}else{printf("0\n");return 0;}}}if(!isleft[i] and !isright[i]){printf("0\n");return 0;}ans=ans*(isright[i]+isleft[i])%mod;}printf("%d\n",ans);
}

B.|{floor(A_i/2^k)}| \(\texttt{Diff 1049}\)

给定 \(N,K\),构造一个长为 \(N\) 的序列,满足序列元素范围在 \([1,2^{K}-1]\) 之间

定义序列价值如下:对于全部的非负整数 \(k\),序列中 \(\lfloor\frac{A_{i}}{2^{k}}\rfloor\) 的不同值个数

如序列 \(\{3,5\}\),当 \(k=0\) 时不同的值个数为 \(2\)\(\{3,5\}\)),当 \(k=1\) 时为 \(2\)\(\{1,2\}\)),\(k=2\) 时只有一个新元素出现 \((\{0,1\})\),和为 \(5\)

请你最大化构造出来的序列的价值

\(N\le 2\times 10^5,K\le 30\)

Solution

发现这个 \(\lfloor\frac{A_{i}}{2^{k}}\rfloor\) 的操作非常像右移啊,其实就相当于 \(A_{i}\operatorname{Rsh} k\)

也就是说要构造一下任意次右移得到的结果最多的序列.

首先考虑到一个更优的 \(A_{i}\) 满足什么条件. 可以想到 \(2A_{i}\) 总是比 \(A_{i}\) 更优,不仅拥有 \(A_{i}\) 的全部情况,且总是比 \(A_{i}\) 要多一个情况: \(2A_{i}\),因此我们只需要考虑在 \([2^{K-1},2^{K})\) 范围内的数字即可.

\(N\gt 2^{k-1}\) 的时候,直接全部都取一遍就行了.

否则,有一结论:答案的上界为 \(1+\sum\limits^{K-1}_{x=0}\min(N,2^{x})\)

证明:考虑每一个区间 \([2^{x},2^{x+1})\),可以发现,对于每一个 \(A_{i}\),它进行操作后最多只有一个数能落在此区间内,而我们有 \(N\) 个数,因此此区间最大值即为 \(N\),同时,考虑到 \(N\) 可能比区间内的数字总和要大,因此最终每个区间的贡献为 \(\min(N,2^{x})\),再加上不在这些区间里的一个贡献 \(0\),总和就是 \(1+\sum\limits^{K-1}_{x=0}\min(N,2^{x})\)

本题的关键不在此处,而是如何去构造一个满足条件的数列.

定义 \(br(x)\) 表示 \(x\)\(K-1\) 位二进制表示下的反串,即如果 \(K=7,x=5\),那么 \(x=000101_{(2)}\)\(br(x)=101000_{(2)}\)

那么按如下操作构造该序列:

\[A_{i}=2^{K-1}+br(i) \]

即可.

根据刚才的证明,可以发现,要达到这个上界,只需要让构造出来的数字满足 \(\forall i,j\rightarrow \operatorname{bit}_{k}(i)\neq \operatorname{bit}_{k}(j)\),其中 \(\operatorname{bit}_{k}(i)\) 表示 \(i\) 的二进制表示中的最高 \(k\) 位. 可以发现自然数的反串满足这个条件:对于 \(i-j=2^{k}\),总是存在 \(\operatorname{bit}_{k-1}\) 使其不同,而二进制反串有很多个,为了使最后的答案取到区间 \([2^{K-1},2^{K})\) 范围内的数,因此我们才构造出 \(K-1\) 位的反串,这样做可以使得到的数字最大为 \(2^{K-1}+2^{K-1}-1=2^{K}-1\),恰好满足条件.

Code
#include<bits/stdc++.h>
using namespace std;
int n,k,t;
int br(int x){int ans=0;for(int i=1;i<=k-1;++i){ans=ans*2+x%2;x/=2;}return ans;
}
int main(){cin>>t;while(t--){cin>>n>>k;if(n>=(1<<(k-1))){for(int i=1;i<=n;++i){cout<<max(1,(1<<k)-i)<<" ";}}else{for(int i=1;i<=n;++i){cout<<(1<<(k-1))+br(i)<<" ";}}cout<<endl;}
}

C.Sum of Number of Divisors of Product \(\texttt{Diff 2408}\)

给定 \(N,M\),求下述式子的值:

\[\sum^{M}_{i_{1}=1}\sum^{M}_{i_{2}=1}\cdots\sum^{M}_{i_{N}=1}f(\prod^{N}_{j=1}i_{j}) \]

其中 \(f(x)\) 定义为 \(x\) 的不同正因子个数

\(N\le 10^{18},M\le 16\)

Solution

首先你需要知道 \(f(x)\) 怎么求,如果你不知道的话请移步 此文章 第 \(4.5\)

考虑到 \(16\) 以内的质数只有六个,即对任意一个 \(\prod\limits^{N}_{j=1}i_{j}\),都可以表述为如下形式:

\[2^{a_{1}}3^{a_{2}}5^{a_{3}}7^{a_{4}}11^{a_{5}}13^{a_{6}} \]

因此我们成功将题意转化为求 \(\prod^{6}_{i=1}(a_{i}+1)\)

然后 DP 做?但是我不知道 DP 怎么做

if anyone known, then teach me plz

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

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

相关文章

「代码随想录算法训练营」第三十五天 | 动态规划 part8

121. 买卖股票的最佳时机题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 文章讲解:https://programmercarl.com/0121.买卖股票的最佳时机.html 题目难度:简单 视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q 题目状态:有一半的思路思路…

【GeoScene】三、GeoScene Enterprise 3.1 在银河麒麟V10上安装部署

前言: 哈哈哈,想到什么就写什么了,没有顺序可言 系统要求:性能越高越好😆😆 然后是下载安装包、连接服务器、上传文件就不写了吧,这些应该都会吧 许可让公司商务找易智瑞的售前申请 一、环境准备 1、关闭防火墙(可选) 停止防火墙:systemctl stop firewalld.service…

yum网络源的配置

yum 的原理 yum 的全称是 Yellow dog Updater,Modified,yum 是 CentOS 或者是 RedHat 中最常见的包管理器。早期的 Linux 发行版安装软件包要解决软件包的依赖问题,这些依赖的问题需要人工手动解决,通常是需要安装的软件有多个依赖,依赖又有其他的依赖所以自行手动安装很麻…

网络划分

视频 子网划分 用 子网掩码 子网掩码 = 网络位 + 主机位 ip地址自然分类127.0.0.1理解为什么进行子网划分 掌握怎么进行子网划分

谷歌浏览器降级的方法-及chromedriver 下载文件

为了适配python selenium 使用 chromedriver 对应当前谷歌浏览器,降级 https://www.chromedownloads.net/chrome64win/#google_vignette 这个地址为谷歌浏览器老版本的地址http://chromedriver.storage.googleapis.com/index.html 这个地址为谷歌浏览器对应的 chromedriver 的…

记录兼职运维的一天

不以物喜,不以己悲,挣钱为主1.背景 7月底部门的运维大哥离职了,奈何又没有新运维接替,至于为什么没有补位,懂得都懂,按老大的意思是先让开发一人顶一块,8月底争取补上。 打心底我有点排斥这事,但是人到中年又有什么办法呢,上有老下有小,唯有苟。 分派给我的部分是服务…

Teamcenter数据库-获取组别

1、select pg.*,isnull(pn.PIPL10N_NAME_4,pn_EN.PIPL10N_NAME_4) cn_group_name fromPPOM_GROUP pgleft joinPL10N_NAME pn on pg.puid = pn.puid and pn.PIPL10N_NAME_7 = ZH_CNleft joinPL10N_NAME pn_EN on pg.puid = pn_EN.puid and pn_EN.PIPL10N_NAME_7 = EN_US

预见未来科技,尽在指尖滑动间——手机产品模型可视化

在这个日新月异的数字时代,手机已不仅仅是通讯工具,它更是我们生活方式的延伸,是连接世界的窗口,是创意与科技的完美结晶。想象一下,在浩瀚的数字海洋中,一款尚未面世的手机,通过高精度的3D建模技术,以逼真无比的方式展现在你眼前。屏幕上的每一个像素都跃动着生命的活…

数据可视化是什么?带你了解各行业看板!

数据可视化是一种通过图形化手段将数据呈现出来的技术,它将复杂的数据和信息转化为易于理解的图表、地图、仪表盘等视觉元素,使得数据的模式、趋势和关系更加直观地展现出来。通过数据可视化,用户可以快速识别重要信息、发现潜在问题,并做出数据驱动的决策。这种技术不仅提…

Jenkins+gitlab+harbor+docker-compose自动化部署配置

本文主要讲解Jenkins在Linux环境下实现自动化部署项目(提供一种思路) 持续集成与持续部署(CI/CD)流程的实现,需要依赖一系列先进的工具和技术。这些工具不仅提高了开发效率,还确保了代码质量和发布的可靠性。以下是构建CI/CD流程所需的关键工具列表及其作用概述:Jenkins…

手把手教你实现Scrapy-Redis分布式爬虫:从配置到最终运行的实战指南

本文详细讲解了如何通过Scrapy-Redis实现分布式爬虫的全过程,涵盖配置步骤、代码实现以及最终运行的效果展示。通过实战操作,帮助读者快速掌握Scrapy-Redis在分布式爬虫中的应用技巧。1.scrapy-redis的环境准备 pip install scrapy-redis安装完毕之后确保其可以正常导入使用即…

建站过程中很容易让人忽视的三大细节

一个网站的建设是需要专业性、技术性很强的人才能够做的,并不是敲打一些代码、上传一些图片就可以的了,如果在建设网站的时候设计不当,很有可能不会让搜索引擎收录,所以用户也就不可能通过检索来访问网站了。在网站建设中大家都很忽视一些关键的细节,比如:关键词的分布,…