专栏文章

题解:CF251E Tree and Table

CF251E题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min78mui
此快照首次捕获于
2025/12/01 21:42
3 个月前
此快照最后确认于
2025/12/01 21:42
3 个月前
查看原文

题解

注意到树的度数不超过 44
当树是一条链时,分类讨论,一定是从某点开始走到头,拐回来走一段之后开始走折线,简单讨论后发现答案是 2(n2n+2)2(n^2-n+2),注意链可以翻转,翻转后算不同的方案。
对于一般情况,先放入一个三度点,设其为树根。
当根存在一个儿子是叶子时,两侧被划分为了两个子问题,否则枚举儿子放在哪边,也是两个子问题。
容易发现我们有两种不同的子问题:
  • 矩形左上(或左下)有一个点,要用这个点的子树铺成一个矩形。
  • 矩形左上和左下各有一个点,要用这两个点的子树铺成一个矩形。
设第一种为 F(u)F(u),第二种为 G(u,v)G(u,v)
先讨论 F(x)F(x)(假设 xx 在左上)。
  • 如果 xx 没有儿子,则无解。
  • 如果 szx=2sz_x=2,答案为 11
  • 如果 xx 有两个儿子,则枚举两个儿子是怎么放置的,设放在下面的为 uu,右边的为 vv
    • uu 的儿子个数为 00,答案加上 F(v)F(v)
    • 否则,uu 的儿子个数必为 11,答案加上 G(v,sonu)G(v,son_u)
  • 如果 xx 有一个儿子:
    • 若子树 xx 为一条链,答案为 szx2\frac{sz_{x}}{2}
    • sonxson_x 放在下面,答案加上 F(sonsonx)F(son_{son_x})
    • 否则找到最浅的有两个儿子的点,设其为 yy,一直直走直到遇到这个点停止,枚举哪个点向下拐。
      • 如果向下拐的点(设其为 z=sony,0z=son_{y,0})有一个儿子,判断一下它能不能把第二行的前缀填满,如果可以,答案加上 F(sony,1)F(son_{y,1})
      • 否则,枚举一下哪个儿子(设其为 sonz,0son_{z,0})能把第二行的前缀填满,如果可以,答案加上的 G(sony,1,sonz,1)G(son_{y,1},son_{z,1})
再讨论 G(x,y)G(x,y)
  • 如果 x,yx,y 没有儿子,答案为 11
  • 如果 x,yx,y 各有一个儿子,答案为 G(sonx,sony)G(son_x,son_y)
  • 否则,设 xx 有一个儿子,答案为 F(sonx)F(son_x)
复杂度看似 O(n2)O(n^2),但是提交后直接过了。
因为 G(u,v)G(u,v) 被调用时,两个点的深度差不超过 11,且在 FF 中被调用时,两点到 lca(u,v)\text{lca}(u,v) 的距离是 O(1)O(1) 的,每次 GG 往后转移只有一个后继,树的节点度数也是 O(1)O(1) 的,因此 GG 的总状态是 O(n)O(n) 的。

评论

0 条评论,欢迎与作者交流。

正在加载评论...