CF edu 175 刷题笔记

A

记数值为 x 的时候,模 3 和模 5 的结果一致。

易知:要使 x 后再次出现模 3 和 模 5 结果一致的情况,需要经过最小公倍数 15

那么满足的条件的数就是 a+15b,a{0,1,2},bZ,直接统计即可。

B

想到了王国边缘这道题,一开始还以为是倍增,后面想了想发现直接模拟就行了。

首先看能不能走到 0,若不能走到,那么直接输出 0;若可以走到,再看它能否还能回到 0,若能,则统计步数 cnt,那么答案就是 kcnt+1,否则答案为 1

C

其实我这道题做复杂了(还是太爱 st 表了)。

还是讲一下原先的思路吧。首先有两个 observation:

1. 覆盖的区间端点一定都是蓝色;
2. 一定不会重复覆盖某个点。

补:对于 1,其实后来才发现有时端点为红色也行,但是向上面那样考虑在做法上是没有问题的。

又不难发现答案是具有单调性的,所以想到二分答案,每次断定一个答案 limit,然后“尝试去覆盖”那些惩罚值比它大的蓝色块(后称为“需改变块”),若最后覆盖次数小于等于 k 就可以,否则不行。

这个“尝试覆盖”的话就是当我们考虑以 i 为左端点覆盖时,在不影响最终结果的条件下尽量地多覆盖“需改变块”,那么就需要从远到近地考虑,同时看覆盖段中有没有红块的惩罚值比当前答案大,若有就不能这么覆盖,继续考虑下一个较近的“需改变块”,直到可以覆盖为止。

但是我们直接枚举这样的块是不行的,需要用双指针进行优化,预处理出所有“需改变块”最远能覆盖的位置。至于看覆盖段中有没有红块的惩罚值比当前答案大就可以用 st 表进行维护,总的时间复杂度为 O(nlogn)

后来看了题解才发现根本不用 st 表,因为覆盖的这一段开头一定是“需改变块”,段中一定是蓝色的,或者红色的但是惩罚值 limit 的(改了以后答案不会 >limit)。

在 check 时直接用双指针判断就行了。

D

vp 时没做出来,主要是不知道状态如何设计,后面看题解理解了。

求树上合法路径数目,很容易想到树形 dp,那么在集合划分时可以依据路径的终点或起点来划分,这里多选择用终点划分(可以类比子序列问题)。

具体地,设 fi 表示以节点 i 结尾的路径条数,那么答案就是 i=1nfi

由于从根出发可以到所有相邻点,所以把这些点的 fi 全部初始化为 0,接着考虑其他的点只能从上一层的非父亲节点走来,所以易得 fi 就等于上一层的 f 之和减去其父节点的 f

posted @   Brilliant11001  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示