POI2014
P3565 HOT
按这三个点中是否存在祖先关系讨论,发现其中必然存在两个点到它们的 lca
距离相等,且这个距离等于第三个点到该 lca
的距离。
而为方便计数,在三个点的 lca
处计算贡献。
下面是很神仙的 dp
状态。
设 \(f_{u,i}\) 表示 \(u\) 子树内到 \(u\) 距离为 \(i\) 的点的数量,\(g_{u,i}\) 表示 \(u\) 子树内满足如下条件的点对数:
$\ \ \ \ \ \ $ 两个点到它们的 lca
的距离相等,且这个距离与 lca
到 \(u\) 的距离的差为 \(i\)。
转移时依次枚举 \(u\) 的儿子 \(v\),转移方程如下(注意计算顺序):
( another loop )
大致就是答案由 \(v\) 中贡献两个点和前面的点中贡献两个点这两种情况组成。
\(f\) 的转移显然。\(g\) 的转移就是以 \(u\) 为定义中的 lca
的新情况或继承 \(v\) 已有的情况。
时间、空间复杂度均为 \(O(n^2)\)。
可以使用长链剖分进一步优化。
P3569 KAR
如何判断某个卡牌顺序能否通过反转形成一个单调不降的序列?
使用贪心。我们将第一张卡牌翻到更小的一面。对于后面的卡牌,若小的一面大于等于前一张卡的当前面值,则翻到小的一面。
否则若大的一面大于等于前一张卡的当前面值,则翻到大的一面。仍不满足则无解。
为了对付单点修改操作,我们对序列建一棵线段树。
线段树上每个结点维护两个值,分别表示这个区间的第一张卡牌翻到小的面和大的面时,通过如上贪心过程得到的最后一张卡牌的面值。若无解,则记为-1。
合并时,同以上贪心决策即可。最终,根据根节点的两个值是否都为-1,判断是否有解。
复杂度 \(O((n+m)logn)\)。
P3579 PAN
\([a,b]\) 内存在 \(k\) 的倍数,等价于 \(k \lfloor \frac{b}{k} \rfloor>=a\)。这是因为 \(k \lfloor \frac{b}{k} \rfloor\) 是不超过 \(b\) 的最大的 \(k\) 的倍数。
考虑枚举最大公因数 \(g\)。由上 \(g\) 合法等价于 \(g \lfloor \frac{b}{g} \rfloor>=a\) 且 \(g \lfloor \frac{d}{g} \rfloor>=c\)。
则对于所有 \(\lfloor \frac{b}{g} \rfloor\) 和 \(\lfloor \frac{d}{g} \rfloor\) 都相等的 \(g\),我们只需要其中最大的一个。我们可以用略作改变的整除分块做到这一点。
复杂度 \(O(\sqrt{b}+\sqrt{d})\)。