20220314 刷题日记
CF1442D
这个题还是很好做的,重点是发现最多只会有一条不选的线段,然后 分治背包 就可以了。
BZOJ4771
注意到我们有一个深度的限制,并且强制在线。
首先不考虑限制,如何处理一棵子树内颜色出现的次数?对于两个颜色来说,我们在这两个节点上加一,然后再lca 上减一就可以了。
对于一条由相同颜色点组成的序列,我们按照 dfs 序进行排序,我们考虑对相邻的两个点做上面的处理,同时对于一个点,其前驱后继的 lca 同样减一。
考虑这样做为什么是对的,我们给某个点加一之后,为了能够查询子树和就可以得到信息,我们需要从这个点往上走,走到第一个点,满足其子树内有另外相同颜色的点,把它减一,这样就可以正确维护。
容易发现,这个点一定是该点与其 dfs 序上前驱后继的 lca。但是我们并不知道是哪一个。所以我们都减去,然后给这两个 lca 的 lca 再加回来,容易发现这两个 lca 一定在一条链上,原因是它们都是该点的祖先。
接下来考虑限制,容易发现这就似乎是下面的点全都不见了,然后询问,所以我们考虑对每个深度建一棵线段树即可,主席树优化空间,就可以通过这道题。
查前驱后继有 set 即可。
CF1446C
考虑到最后我们实际上是只能找到一组数,互为最小,所以考虑到 Trie 树的性质,我们直接在 Trie 树上 dp 就可以完成。
T11738
考虑链加和子树加都可以重链剖分之后差分,然后差分后变成若干前缀操作,可以用树状数组,更好的做法是排序完了之后离散化,然后直接做就行。
能离线先考虑离线,因为在线是不优于离线的。
CF1439B
考虑如何得到一个点集,满足每个点的度数大于等于 \(k\),可以考虑用类似拓扑的方法,每一次从图里删掉度数小于 \(k\) 的点,并更新点的度数。
考虑一个 \(k-1\) 度点组成的 \(K_k\),我们考虑怎么做,我们只需要删点,如果删到了一个 \(k-1\) 度点,把它和它相连的点拉出来看是不是团。
这样做的复杂度呢,容易知道 \(k\) 是 \(\sqrt{m}\) 级别的一个数,我们判断是否有边可以通过在 vector
二分,所以我们可以做到 \(k^2\log m\),所以判断复杂度为 \(m\log m\) 的。我们最多要判断 \(\frac{m}{k}\) 次,所以大概是一个 \(m\sqrt{m}\log m\),反正可以过。
ARC117VP
结果制作出来 ABC 题,D 题没做出来。