CF edu 175 刷题笔记

\(\texttt{A}\)

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

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

那么满足的条件的数就是 \(a + 15b,a\in \{0,1,2\}, b\in\mathbb{Z}\),直接统计即可。

\(\texttt{B}\)

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

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

\(\texttt{C}\)

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

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

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

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

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

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

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

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

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

\(\texttt{D}\)

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

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

具体地,设 \(f_i\) 表示以节点 \(i\) 结尾的路径条数,那么答案就是 \(\sum\limits_{i = 1}^{n}f_i\)

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

posted @ 2025-03-01 17:33  Brilliant11001  阅读(6)  评论(0)    收藏  举报