CF Educational Round 138 乱做

1749

做着玩的。因为倒着做的,所以倒着写。

F

10.1 tyy讲过套路。然后这场在他讲完之后。我愿称之为押题大师。不幸的是这场没打,不然上大分了。

先树上差分,然后对于每一个节点记一个他下面第 \(0\le i\le 20\) 层儿子加的标记,然后查询的时候直接向上跳最多 20 个父亲加起来即可。由于树上差分,要用树状数组维护前缀和计算子树内的和(这个维护dfs序即可)。然后问题就在于如何维护到路径距离是 \(d\) 的点。乍一看是点分治,但是tyy讲了这个套路,对于 \(u,v\) 路径上除了 \(LCA\) 的所有点,将其对应第 \(d\) 层儿子的标记修改,对于 \(LCA\) 开始往上的 \(d\) 层(他自己是第一层),第 \(i\) 层将其 \(d-i+1,d-i\) 这两层的标记修改(最上面一层只剩0)。

E

由于刚刚做完的 div.1 D 也是个最短路,故此题也不难发现最短路。

直接建立超级源汇点,然后连到第一列和最后一列(所有边权都是终点是否已经是仙人掌,超级汇点除外),中间只向左上右下左下右上(不要漏了左下右下,他给定的已经填的位置可能使这样变优)连边,然后跑最短路记录转移即可。注意当边的起点或者终点有一个周围有仙人掌就不能连这条边。

D

傻逼题。操作序列全是 \(1\) 的就不模棱两可,否则都是。所以你计算全是 \(1\) 的即可。这个好算。对于 \(a_i\),其必须包含不大于 \(i\) 的所有质数作为因数,则容易计算个数(用 \(m\) 取除然后乘起来即可)。

然后你枚举长度,容易发现 \(m\) 经过很少次除法就归零了。所以暴力做到归零就行。

剩下的太水,不做了。

posted @ 2022-10-26 20:10  infinities  阅读(8)  评论(0编辑  收藏  举报