POI2014

P3565 HOT
按这三个点中是否存在祖先关系讨论,发现其中必然存在两个点到它们的 lca 距离相等,且这个距离等于第三个点到该 lca 的距离。
而为方便计数,在三个点的 lca 处计算贡献。
下面是很神仙的 dp 状态。
\(f_{u,i}\) 表示 \(u\) 子树内到 \(u\) 距离为 \(i\) 的点的数量,\(g_{u,i}\) 表示 \(u\) 子树内满足如下条件的点对数:
$\ \ \ \ \ \ $ 两个点到它们的 lca 的距离相等,且这个距离与 lca\(u\) 的距离的差为 \(i\)
转移时依次枚举 \(u\) 的儿子 \(v\),转移方程如下(注意计算顺序):

\[ans\leftarrow ans+g_{v,j}*f_{u,j-1} \]

\[ans\leftarrow ans+f_{v,j}*g_{u,j+1} \]

( another loop )

\[g_{u,j+1}\leftarrow g_{u,j+1}+f_{v,j}*f_{u,j+1} \]

\[g_{u,j-1}\leftarrow g_{u,j-1}+g_{v,j} \]

\[f_{u,j+1}\leftarrow f_{u,j+1}+f_{v,j} \]

大致就是答案由 \(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})\)

posted @ 2024-05-01 21:20  studentDL  阅读(1)  评论(0编辑  收藏  举报