[ARC125F]Tree Degree Subset Sum

Posted StaroForgin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ARC125F]Tree Degree Subset Sum相关的知识,希望对你有一定的参考价值。

Tree Degree Subset Sum

题解

我们考虑记 d i d_{i} di为点 i i i的度数减 1 1 1,此时有 ∑ i = 1 n d i = n − 2 \\sum_{i=1}^{n}d_{i}=n-2 i=1ndi=n2
很明显,此时不同的 d d d最多有 n \\sqrt{n} n 个。
我们记 m ( s ) m\\left(s\\right) m(s) d d d的总和为 s s s时最少的选择点集合,而 M ( s ) M\\left(s\\right) M(s)表示 d d d总和为 s s s时所选择的点的最多的集合, A ( s ) A(s) A(s)表示何为 s s s的某一个选择点集合。
我们记 c n t i cnt_{i} cnti表示 d d d i i i的点的个数,很容易发现有 ∑ i ⩾ 2 c n t i ⩽ c n t 0 − 2 \\sum_{i\\geqslant 2}cnt_{i}\\leqslant cnt_{0}-2 i2cnticnt02
可得 − c n t 0 ⩽ s − ∣ M ( s ) ∣ ⩽ s − ∣ m ( s ) ∣ ⩽ ∑ i ⩾ 2 c n t i = c n t 0 − 2 -cnt_{0}\\leqslant s-|M(s)|\\leqslant s-|m(s)|\\leqslant \\sum_{i\\geqslant 2}cnt_{i}=cnt_{0}-2 cnt0sM(s)sm(s)i2cnti=cnt02,相当于从 M ( s ) M(s) M(s)的集合中找出所有非 1 1 1的点。
自然有,
( s − ∣ m ( s ) ∣ ) − ( s − ∣ M ( s ) ∣ ) = ∣ M ( s ) ∣ − ∣ m ( s ) ∣ ⩽ c n t 0 − 2 + c n t 0 = 2 c n t 0 − 2 (s-|m(s)|)-(s-|M(s)|)=|M(s)|-|m(s)|\\leqslant cnt_{0}-2+cnt_{0}=2cnt_{0}-2 (sm(s))(sM(s))=M(s)m(s)cnt02+cnt0=2cnt02
而集合 M ( s ) M(s) M(s)中肯定包含所有 0 0 0,而集合 m ( s ) m(s) m(s)中肯定一个 0 0 0都不包含,在其中加入 0 0 0与取出 0 0 0可以实现 [ ∣ m ( s ) ∣ , ∣ m ( s ) ∣ + c n t 0 ] ⋃ [ ∣ M ( s ) ∣ − c n t 0 , ∣ M ( s ) ∣ ] = [ ∣ m ( s ) ∣ , ∣ M ( s ) ∣ ] [|m(s)|,|m(s)|+cnt_{0}]\\bigcup[|M(s)|-cnt_{0},|M(s)|]=[|m(s)|,|M(s)|] [m(s),m(s)+cnt0][M(s)cnt0,M(s)]=[m(s),M(s)],所以我们选择构成 s s s的数的个数在 [ ∣ m ( s ) ∣ , ∣ M ( s ) ∣ ] [|m(s)|,|M(s)|] [m(s),M(s)]之间都是可以的。
而每一个 ( x , y ) (x,y) (x,y)肯定都对应唯一的 ( x , y − x ) (x,y-x) (x,yx),所以我们统计出的每一个 ( s , ∣ A ( s ) ∣ ) (s,|A(s)|) (s,A(s))都是都与某一个 ( x , y ) (x,y) (x,y)一一映射。

既然我们不同的 d d d最多有 n \\sqrt{n} n 个,我们可以考虑用 d p dp dp来求出 ∣ m ( s ) ∣ |m(s)| m(s) ∣ M ( s ) ∣ |M(s)| M(s)
我们定义 d p i dp_{i} dpi表示 ∣ m ( i ) ∣ |m(i)| m(i),转移明显是一个背包的过程。
对于 d d d相同的数,我们可以采取优化更快的方法进行转移。
虽然二进制拆分可以做到 O ( n n log ⁡   n ) O\\left(n\\sqrt{n}\\log\\,n\\right) O(nn logn),我们仍然可以优化复杂度。
考虑将对于 i ∈ [ 0 , n − 2 ] i\\in[0,n-2] i[0,n2]我们可以将它们按模 d d d的值分为 d d d类, d p i dp_{i} dpi可以从 { d p x ∣ x ∈ [ i − d s u m d , i ] ∧ x ≡ i ( m o d   d ) } \\{dp_{x}|x\\in[i-dsum_{d},i]\\wedge x\\equiv i(mod\\,d)\\} {dpxx[idsumd,i]xi(modd)}转移过来,可以用单调队列进行优化。
这样,我们的 d p dp dp转移就被成功优化到 O ( n n ) O\\left(n\\sqrt{n}\\right) O(nn )了。
显然, ∣ M ( i ) ∣ = n − ∣ m ( n − 2 − i ) ∣ |M(i)|=n-|m(n-2-i)| M(i)以上是关于[ARC125F]Tree Degree Subset Sum的主要内容,如果未能解决你的问题,请参考以下文章

F2 - Spanning Tree with One Fixed Degree - 并查集+DFS

Gym - 101438F Tree Game

[ARC121E]Directed Tree

[ARC121F]Logical Operations on Tree

Codeforces 963B Destruction of a Tree 贪心

B-Tree - 为啥没有偶数个键的节点?