牛客寒假训练赛第一场
1|0基本状况
赛时开了五题,B题大分讨卡住了,其他题目就看了题面。
有几个基本状况:
- 贪心题没有深入思考,就无脑二分入手,倒是大量罚时。
- 分讨思路不清楚。
- E题很搞,名字叫贪心题但是纯爆搜,爽切。
2|0A
https://ac.nowcoder.com/acm/contest/67741/A
虽然签到题,但是学习一下 jly 写法。
- 我的
- jly
3|0E
https://ac.nowcoder.com/acm/contest/67741/B
继续向jly学习
- 我的爆搜
- jly的爆搜
jly 这里有三点值得学习:
-
可递归的函数写法,我一开始也是这样写但是CE了,要学一下。
-
找该选手名次的方法,我用的是把选手和分数存入数组再排序,而jly更直接,直接比较大于该选手分数的人的数目。
-
爆搜三种情况的写法,我是复制黏贴,复用性差,jly利用循环来简化代码,而且step传0参进去也不用在函数外写一遍针对step = 1的处理
4|0B
https://ac.nowcoder.com/acm/contest/67741/B
神志不清,分讨树精
这题给我一个教训,这类大模拟不要无脑加特判,一定要归纳各种特殊性到一般性,尽量精简代码,特判加多了基本上就是偏了。
-
我的
大方向肯定是没错的,用
pair<int,int>
来标记坐标,然后分讨。我的做法是先按正负坐标排序,然后左右分讨,最后在讨论三角形情况。
过了两天,终于改出来了。
其实当时思路的难点就是如果
下方有一个 ,那么左边和右边就都只再需要一个,我当时的思路是最后再搞一大堆分讨: -
直接在
初始化的时候处理就行。因为上述情况其实就等价于第一种状况下左/右侧已经有一个着火点的情况了,所以这种情况下
初始值也是 。 -
对循环范围的特判。
这是不行的,如果循环处理的时候存在
,那么如果是只有左/右边有一个着火点的状况,这样处理会让 ,显然错误。所以处理的时候不要管 的状况。 -
最后再处理一下最大值为三这个性质
-
初版
进一步,发现
没有必要,直接遍历桶容器内元素即可,而且桶也没必要用 ,用 平替就行。 -
优化
5|0G
一开始写成对每一段进行二分,正确性应该没问题但是太复杂了,不知道哪里细节错误。
后面发现这题可以直接贪心求答案。
已经犯过很多次这类错误,当一个做法很绕很复杂的时候,要考虑能不能换做法。
贪心思路很简单,维护前缀和判断就行。
但是这题之所以要写个博客,是因为这种只要维护一个前缀和的题目,我一直在无脑写前缀和数组。
老样子。
- 我的
- jly
用一个sum动态维护前缀和即可。
6|0L
结论题,其实一开始想法是对的,贴地的照明范围最大,但是没啥信心也没做下去。
也是因为审题不认真,实际上墙和光源的距离是光源和背景墙的两倍,就是用中位线算就完全可以处理。
7|0I
https://ac.nowcoder.com/acm/contest/67741/I
第一次见,毫无思路
核心思路
- 找到两种方法会使得哪个统计量有显著区别,尝试区分这个统计量的均值
- 如果这个统计量不好直接求,可以本地真的实现以下两种生成方式,然后生成大量数据,真的随机出这个统计量的真实值
- 比如求出法
该统计量均值 、法 该统计量均值 ,那对于输入数据,直接看输入 数据的该统计量 和 与 谁更近就行了。
太抽象了,是一种很新的题,似乎是模拟了机器学习的一些理论。
8|0F
-
相关知识:第二类斯特林数
- 将
个 bit 每个 bit 看作一件物品 - 将
个数字每个看作一个集合 - 注意到这几乎就是第二类斯特林数
的定义: 个有区别球放到 个无区别盒子 - 还差在哪里呢?我们发现,本题的盒子(
)并不是无区别的,但因为第二个条件要求了 每个盒子里的数从小到大有序,所以对于 中的每一种方案,对其按 大小排序就得 到了本题的一种方案,且可以证明这是一种一一映射(重点是证明没有多对一) - 因此,本题答案就是斯特林数
- 第二类斯特林数的容斥求法,可以在log复杂度里做出这题
- 将
-
第二类斯特林数
-
将
个有区别的球放入 个无区别的盒子的方案数- 有区别的定义
五个有区别的球选三个 五个没区别的数选三个
- 有区别的定义
-
(此题要求盒子非空)-
无区别的定义
和 是同一种方案。
-
方案数为
-
若不要求非空,显然答案为
,即 . -
若有
个为空,且盒子和球都有区别,则方案数为 -
然后用容斥原理,容斥成非空个数(错排数),最后为了转化有区别为无区别,再除以
-
-
9|0H
https://ac.nowcoder.com/acm/contest/67741/H
位运算好题
- 先考虑每个物品的重量都只含
的情况,可以帮助对这题要解决什么问题有个大致了解 - 记所选物品重量或起来是
,枚举 𝑚 里是 的某个 ,强制 𝑐 里该位为 ,则该位将 𝑚 分成了前后两部分- 对于前面的那部分位(更高位),要求所选的物品这些位必须是𝑚的子集(即𝑚对应位是
才能选) - 对于后面的那部分位(更低位),没有任何限制
- 对于前面的那部分位(更高位),要求所选的物品这些位必须是𝑚的子集(即𝑚对应位是
- 因此,枚举 𝑚 里每一位作为这个分界,每个物品就变成了要么能选要么不能选、彼此之间也不影响,所以把能选的都选上就好,最后再特判一下
的状况,即可保证枚举了所有情况
get函数内穿的参数用了几个 trick.
通过这个参数与
10|0K
https://ac.nowcoder.com/acm/contest/67741/H
基环外向树?折磨!
大意:第
-
基环外向树
条边- 每个点出度为
- 即所有点必然入环
-
首先,每个
向 连一条有向边,表示 的答案被 限制住了;该题的依赖性质构成了基环外向树森林- 首先所有连到环的链可以直接无视,它们不影响答案
- 因为这个链所连接的环那个点确定答案后、链上每个点的答案可以由此反向传播依次得到(至于为何每个点答案唯一?这是因为该点走到环的路径上所有排列复合得到的仍是排列),因此,环上点确定方案、则链也随之确定唯一一种方案,所以可以忽略链
- 对于环,我们随机选个起点,暴力枚举这个点选 ABCDE 中哪个选项然后暴力模拟来 check 这个选项是否能让这个环满足条件即可
- 因此,每个基环内向树的答案是0~5之间整数
- 最后的答案是每个基环内向树答案的乘积
- 首先所有连到环的链可以直接无视,它们不影响答案
11|0D
https://ac.nowcoder.com/acm/contest/67741/D
通过题目分析出特性,进而剪枝
核心是要注意到:询问的
- 最终数组,绝对值非
的最多 个- 枚举哪个数变成
或 ,然后把此时数组乘积算出来,在枚举前先判断一下这 个数变的话能不能保证变后绝对值非 的最多 个,所以真正要枚举的数不多; ,此时要么第一个数绝对值在 内、要么第二个数绝对值在 内,否则,前两个数乘积的绝对值一定大于 ;因此我们 的暴力枚举就可以;
- 枚举哪个数变成
12|0J
https://ac.nowcoder.com/acm/contest/67741/J
思维难度有点大
-
最关键的性质:考虑第
个任务结束时,一定有一个人在 𝑎𝑖 处;(听上去是废话)- 这提示我们,只需要记录,另一个人可能的位置,可以用 set 来存;
-
具体做法
- 二分答案
,check
的写法是遍历所有的人物,用一个set存:此时,一个人在 𝑎𝑖 处,另一个人可能的位置集合; - 若某个时刻set为空,则check失败;否则,check成功;
- 注意向 set 里插入
的时机需要仔细考虑,一种正确的插法是- 在
处判断若 是否成立 - 若成立,插入
- 在
- 二分答案
__EOF__

本文链接:https://www.cnblogs.com/kdlyh/p/18005064.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下