码迷,mamicode.com
首页 > 其他好文 > 详细

harmakik

时间:2018-09-07 11:09:05      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:max   转移   复杂   lin   solution   自己   play   har   推出   

Solution

  
  对于原树一个节点\(x\)
  
  \(f_x(h)\)表示,\(x\)作为一个深度为\(h\)的点时,\(x\)及其子树的安排方案有多少(不考虑\(x\)具体在深度为\(h\)的哪个点)
    
  \(F_x(h)\)表示,对于一个固定的深度为\(h\)的节点\(y\)\(x\)\(y\)或其子树中,\(x\)及其子树的安排方案有多少。
  
  则有关系:
\[ F_x(h)=\sum_{i\ge h}f_x(i)*2^{i-h} \]
  对于叶子:
\[ F_x(h)=[h\le h_x]2^{h_x-h} \]
  已知二者都可以表示成这些形式
\[ f_x(h)=\sum_{i\geq 0}c_i*2^{-ih}\F_x(h)=\sum_{i\geq 0}c_i*2^{-ih} \]
  对于叶子\(x\),赋值后直接回溯:
\[ c_1=2^{h_x} \]
  
  依照60分DP,可以推出由儿子到自己的转移(两个\(c\)分别是两个\(F\)\(c\)\(c'\)是转移后的\(f_x\)\(c\)):
\[ \begin{aligned} f_x(h)&=F_l(h+1)F_r(h+1)\&=(\sum_{i\geq 0}c_i2^{-i(h+1)})(\sum_{j\geq 0}c_j2^{-j(h+1)})\&=(\sum_{i\geq 0}\frac{c_i}{2^i}2^{-ih})(\sum_{j\geq 0}\frac{c_j}{2^j}2^{-jh})\&=\sum_{i\ge0}{c'}_i2^{-ih}\\end{aligned} \]
  当然,也可以在卷积完之后每个\(c_i\)除去\(2^i\)
  
  观察到这个卷积,再考虑边界,\(c\)的下标为\(0...siz[x]\)\(siz[x]\)\(x\)子树中叶子数。暴力卷积,用树上背包思路分析,这一步的复杂度是全局\(\mathcal O(n^2)\)
  
  得到自己的\(f\)后,由于父亲要使用自己的\(F\),所以根据定义式由\(f\)推出\(F\)
\[ \begin{aligned} F_x(h)&=\sum_{h \le i<maxh}f_x(i)*2^{i-h}\&=\sum_{h \le i<maxh}\sum_{j\ge 0}c_j*2^{i(1-j)-h}\&=\sum_{j\ge0}\frac{c_j}{2^h}\sum_{h \le i<maxh}(2^{(1-j)})^i\&=\sum_{j\ge0}\frac{c_j}{2^h}\frac{(2^{1-j})^{maxh}-(2^{1-j})^{h}}{(2^{1-j})-1}\&=\sum_{j\ge 0}c_j(\frac{2^{(1-j)maxh}}{2^{1-j}-1}2^{-h}-\frac{1}{2^{1-j}-1}2^{-jh}) \end{aligned} \]
  答案即\(F_1(0)\)\(\sum c_i\)
  
  PS:\(c_0\)没用

harmakik

标签:max   转移   复杂   lin   solution   自己   play   har   推出   

原文地址:https://www.cnblogs.com/RogerDTZ/p/9602469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!