CF2001 题解

news/2024/11/6 19:18:25/文章来源:https://www.cnblogs.com/Sugar-Cube/p/18530874

A

给定循环数组,每次操作时,设当前大小为 m。
选择 $i\in [0,m)$,若满足 $a_i\le a_{i+1\bmod m}$,则可删除 $a_i,a_{i+1 \bmod m}$ 中的任意一个。
求最小的操作次数,使得数组中所有元素都相等。
$n\le 100$

操作非常强,除了两个相邻位置相等的情况,可以删除任意元素。
然而所有位置都相等正好是我们需要的答案,所以答案既是 n 减去众数的数量,卡到了上界。
代码

B

对于一个排列 p,你要访问它的每个位置。
具体来说,你要一次访问 $1,2\cdots n$。
现在有两种方式,方式一起点在 1 位置,只能往右走,方式 2 起点在 n 位置,只能往左走。
当无法通过移动走到下一个位置时,就要回到起点。
给你 $n$,构造一个排列,使得两种方式回到起点的次数相等,或输出无解。
$n\le 10^5$

有人想 dilworth 想假了我不说是谁。

容易计算出两种方式回到起点的次数,发现是方式一是对所有 \(pos_{x+1}<pos_{x}\) 的 x 计数,方式二同理。
容易发现两种方式加起来的次数是 \(n-1\),故偶数时无解。
那么奇数时是好构造的,只需两侧对称排列即可,形如 \(1,3,5\cdots 6,4,2\) 即可。
代码

C

交互题。
有一棵树,已知树的大小,你要在不超过 $15n$ 次询问内得到树的结构。
每次可以询问两个点,得到它们的中点,若路径长度为奇数则返回靠近第一个点的那个点。
$n\le 1000$

容易想到分治的做法。
考虑到不断询问一个点到根的路径即可。
对于之前已确定的点打上标记,若询问到打标记的点就跳过,这样就能保证复杂度了。

这个做法在链上时最劣,可以卡到 \(\mathcal O(n\log n)\)
代码

D

给定原序列,要求选出一个极长的,元素至多出现一次的子序列。
最小化该子序列所有奇数位置乘上 -1 后的字典序。
$n\le 10^5$

提供两种想法:
每次贪心选择最答案中的第一个位置。
只需考虑不能让当前未选元素无法选择,即选择元素的位置必须不大于所有剩余元素的最后一个位置。
区间最值即可,再加一个能维护删除和全局最值得的结构。

每次考虑当前位置是否能放到答案中。
可以用栈做到线性,只需弹栈并维护每个元素的最后位置,正确性是显然的。
注意考虑可能可以一次弹两个元素。

有很多设计的方法,本质上在于最优子结构的性质太强了。

E Easy Version

有一个大根堆,但是是满二叉树,给定树高 $n$。
一次 pop 操作形如:从根节点开始,每次选择两个儿子中权值较大的那个进行交换(若两个儿子权值相等则这次 pop 操作不确定),直到到达叶子。
一个堆是确定的,当且仅当对其进行一次 pop 操作,该操作确定。
一个堆是可构造的,当且仅当它可以通过如下方式构造出:
所有位置初始都是 0,任选恰好 k 个点进行根链加一。
不难证明通过该过程构造出的堆满足大根堆的性质。
给定 $n,k$ 和质数模数 $p$,对于可构造和确定的堆进行计数。
$n\le 500,k\le 500,10^8\le p\le 10^9$

很复杂的定义,但是注意到构造过程的影响。
容易发现一个点的权值由其子树内的操作次数决定。
于是可以考虑进行子树内操作步数分配的 dp:
定义 \(f_{i,j}\) 表示在高为 \(i\) 的堆中进行 \(j\) 次操作的合法堆个数。
转移考虑枚举左右儿子的操作步数分配:
由于小的那个儿子不用管,所以可以任意分配,方案数形如一个插板,故设 \(sz(i)=2^{i}-1\)
\(f_{i,j}=2\sum\limits_{k=1}^{j}f_{i-1,k}\sum\limits_{p=0}^{\min(k-1,j-k)}\binom{sz(i-1)+p-1}{sz(i-1)-1}\)
这样转移是 \(\mathcal O(nk^{3})\) 的,考虑优化。
右面这个组合数看起来很好合并,考虑组合意义有如下式子:
\(\sum\limits_{i=0}^{m}\binom{n+i}{n}=\binom{n+m+1}{n+1}\)
(只需考虑枚举分配方案的最后一个位置是什么)。
故直接优化可做到 \(\mathcal O(nk^{2})\)
组合数的计算用 lucas,或者用 \(\binom{n}{m}=\frac{n}{n-m}\binom{n-1}{m}\) 递推即可。
代码

E Hard Version

[Luogu](https://www.luogu.com.cn/problem/CF2001E2)
有一个大根堆,但是是满二叉树,给定树高 $n$。
一次 pop 操作形如:从根节点开始,每次选择两个儿子中权值较大的那个进行交换(若两个儿子权值相等则这次 pop 操作不确定),直到到达叶子,最后把叶子设为 -1。
一个堆是确定的,当且仅当对其连续进行两次 pop 操作,该操作确定。
一个堆是可构造的,当且仅当它可以通过如下方式构造出:
所有位置初始都是 0,任选恰好 k 个点进行根链加一。
不难证明通过该过程构造出的堆满足大根堆的性质。
给定 $n,k$ 和质数模数 $p$,对于可构造和确定的堆进行计数。
$n\le 100,k\le 500,10^8\le p\le 10^9$
思路解析
正解

考虑到 Easy Version 的做法,想到去进行子树分配式的递推。
由于这部分的转移跟二阶儿子有关,所以记 \(f_{i,j,k},g_{i,j},h_{i,j,k}\) 分别表示树高 \(i\) 层,子树内分配即根节点权值为 \(j\),较大的那个儿子为权值为 \(k\) 的一次确定堆,任意堆,二次确定堆方案数。

\(g\) 的值为组合数,\(f\) 的值只需在 Easy Version 的基础上稍加转移即可。
考虑 \(h\) 的转移,要不然是在同一个子树上操作两次,要不然是各操作一次,故可列出转移式:
\(h_{i,j,k}=2g_{i-1,j-k}\sum\limits_{p=j-k+1}^{k}h_{i-1,k,p}+2\sum\limits_{t} f_{i-1,j-k,t}\sum\limits_{p=0}^{j-k-1} f_{i-1,k,p}\)
直接前缀优化就可做到 \(\mathcal O(nk^{2})\)

实现细节

代码

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

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

相关文章

c语言中声明数组时, 元素个数必须使用常量表达式

001、[root@PC1 test]# ls test.c [root@PC1 test]# cat test.c ## 测试程序 #include <stdio.h>int main(void) {int var1 = 5; // 初始化一个变量var1int array1[var1] = {3,5,8,4,9}; // 初始化数组return 0; } [root@PC1 test]# gcc test.c …

图的基本操作

目录1.图2.图的结构体定义3.图的初始化4.添加顶点、删除顶点4.1添加顶点4.2删除顶点5.添加边、删除边5.1添加边5.2删除边6.打印图7.main函数 在生命旅途中,我们就像是一个个节点,被无数看不见的边相连。每一次的相识与相离,都在这张巨大的网络图中留下独特的印记。 1.图 图(…

正态分布

正态分布 1 标准正态分布 1.1概率密度函数 \[f(x) = \frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}} \]1.2 累计分布函数 \[F(x) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x}e^{-\frac{t^2}{2}}dt \] 2 (一般)正态分布 2.1 概率密度函数 \[f(x) = \frac{1}{\sqrt{2\pi\sigma…

Pycharm中使用AI辅助Coding工具Aws Toolkit

一、安装插件 二、重启完了以后点击左下角的aws 三、点developer tools,双击codewhisperer中的start,点击connect 四、点击sign out,open and copy code五、跳转到网页浏览器中打开登录界面,我们在图中所示的 code 一栏中粘贴上验证码,点击"next"按钮六、没有账…

【日志分析平台】Logstash:IT-ELK日志分析平台

以下文章来源于唯云轩 ,作者唯云轩 上篇介绍了ELK日志分析平台-Elasticsearch集群的搭建,本篇章为大家介绍Logstash的安装 服务器规划及Elasticsearch集群搭建参考上一篇:IT-ELK日志分析平台-Elasticsearch集群 Logstash安装步骤如下官网下载安装包下载地址: (https://www.e…

Next 设置字体文件cdn 或者本地

@font-face {font-family: font-ali-bold;src: url(https://cdnurl/Alibaba-PuHuiTi-Bold.woff2) format(woff2);font-weight: normal;font-style: normal; }tailwind 设置 fontFamily 直接使用变量, 直接在className上写 font-ali 即可应用该字体 本地:// const aliF…

WPF的入门学习

环境的搭配 我们通过VS的官网来安装的VS2022,安装上C#的功能,这样就完成了环境的搭配 第一个wpf工程 打开vs2022,点击如图的创建新的工程。点选WPF的项目配置一个新的项目这样就完成了项目的创建项目结构 介绍一下大概的项目结构在APP.XAml文件中,设置我们的窗体入口界面的…

【安全架构】权限控制模型

原创 大袤宏图不同的权限模型提供了灵活的访问控制策略,本文绘制了不同模型的ER图,探讨这些模型的原理及适用场景。 一、访问控制列表模型 访问控制列表模型(Access Control List, ACL) 基于资源的访问控制列表,每个资源都有一个列表记录哪些用户可以对其进行哪些操作,适用…

不用代码,2小时搞定自己的网站

之前有许多人咨询过怎么建个官网,有没有 便宜,省事,且数据由自己掌控的方式。 毕竟一个企业在初期,如果不是IT行业,不一定有程序员,但是数据由自己掌握,未来发展壮大了,人员角色被齐了,就可以在原来的基础上做更好的发展了。 最近我也把玩了一个自助建站的产品,快速试…

PentesterTools:简单的SQLMap图形化辅助工具

原创 XiaoTouMingyo Hack分享吧免责声明 该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。工具介绍 SQLmap辅助工具是一款图形用户界面(GUI)工具,旨在简化和增强SQLmap的使…

【Xshell】高级用法: “隧道转发”

原创 大龙山悟道 IT运维不跑路xshell隧道转发类型 类型一:本地拨出 Local(Outgoing)作用:将本地计算机指定的某个端口连接到远程服务器的一个指定端口上。 应用场景:当从本地机器安全地访问位于远程服务器上的服务(如数据库、web服务等)时使用。 工作原理:通过SSH连接,用…

【安全运维】检测即代码(DAC) 详细步骤

原创 Zafkie1 SecLink安全空间引言 DAC(Detection As Code),检测即代码是一种战略方法,可将安全检测机制无缝集成到软件开发生命周期中。通过将安全控制视为代码,组织可以在整个SIEM运维过程中自动部署、配置和维护安全措施。 或许很多人听说过DAC的概念,但是并没有一步步地…