首页 > 其他分享 >p4845-solution

p4845-solution

时间:2024-03-04 20:58:36浏览次数:31  
标签:子树 p4845 中灯 solution ex 照亮 闲置 最远

P4845 Solution

link

考虑树形 dp,对于每个 \(u\) 直接钦定它的三种可能状态:有灯,没灯但是被其他灯照亮,没灯也没被照亮。

这样钦定会导致一些需要被照亮的点在当前子树中还未被照亮,需要依靠子树外的灯来照亮。称这种点为闲置点

状态内只需要记录闲置点中最深的到子树根的距离,以及最浅的灯到根的距离,以试图照亮其他子树内的闲置点。

设 \(dp_{u,i,j,k}\) 表示,子树 \(u\) 内选了 \(i\) 个作为灯,深度最深的闲置点距离 \(u\) 为 \(j\),最浅的灯距离 \(u\) 为 \(k\),的最大价值。

状态数很多,考虑缩减。注意到必然有 \(j+k>r\),否则闲置点可以被这个灯照亮,就不是闲置点了。

这个闲置点最终一定被子树 \(u\) 外的某个灯 \(L\) 照亮。那么有 \(dis(u,L)+j\le r\)。

这揭示 \(k>dis(u,L)\)。意味着,灯 \(L\) 完爆子树 \(u\) 内所有灯,子树 \(u\) 内灯能照到的所有子树外的点,\(L\) 也能照到。

这说明所有子树 \(u\) 内的灯不在未来发挥作用,\(k\) 这个信息可以不用记录了。

若子树 \(u\) 内存在闲置点,则只需要记录 \(j\);若不存在闲置点,则只需要记录 \(k\)。即,\(j,k\) 之中只有一个需要记录。

修改 dp 状态,设 \(dp_{u,ex=0/1,i,j}\) 表示子树 \(u\) 内是否有闲置点,选了 \(i\) 个灯,若有闲置点则 \(j\) 表示深度最深的闲置点到 \(u\) 距离,若无闲置点则 \(j\) 表示深度最浅的灯到 \(u\) 距离,的最大价值。

树上背包的转移,我们考虑如何合并 \(u\) 和一个子树 \(v\) 的信息。

枚举 \(u,v\) 的 \(ex,i,j\),则新的 \(ex',i',j'\) 应该为:

  • 若 \(ex_u=ex_v=0\)

此时只需要更新最近的灯距离,\(ex'=0,i'=i_u+i_v,j'=min(j_u,j_v+1)\)。

  • 若 \(ex_u=ex_v=1\)

此时只需要更新最远的闲置点距离,\(ex'=1,i'=i_u+i_v,j'=max(j_u,j_v+1)\)。

  • 若 \(ex_u=0,ex_v=1\)

讨论 \(u\) 中灯能不能照到 \(v\) 中最远闲置点:

1.若 \(j_u+1+j_v\le r\)

此时 \(u\) 中灯能照到 \(v\) 中最远闲置点,新子树不再有闲置点,\(ex'=0,i'=i_u+i_v,j'=j_u\)。

2.若 \(j_u+1+j_v>r\)

此时 \(u\) 中灯不能照到 \(v\) 中最远闲置点,新子树仍有闲置点,\(ex'=1,i'=i_u+i_v,j'=j_v+1\)。

  • 若 \(ex_u=1,ex_v=0\)

讨论 \(v\) 中灯能不能照到 \(u\) 中最远闲置点:

1.若 \(j_u+j_v+1\le r\)

此时 \(v\) 中灯能照到 \(u\) 中最远闲置点,新子树不再有闲置点,\(ex'=0,i'=i_u+i_v,j'=j_v+1\)。

2.若 \(j_u+j_v+1>r\)

此时 \(v\) 中灯不能照到 \(u\) 中最远闲置点,新子树仍有闲置点,\(ex'=1,i'=i_u+i_v,j'=j_u\)。

考虑复杂度,树上背包部分是 \(\Theta(nk)\),枚举 \(j_u,j_v\) 是 \(\Theta(r^2)\),总共 \(\Theta(nkr^2)\)。

注意到若 \(kr>n\),容易发现一定有方案所有点都选上,我们只需要解决 \(kr\le n\) 的情况。

这样复杂度是 \(\Theta(n^2r)\)。考虑优化枚举 \(j_u,j_v\),我们直接枚举最终的 \(j'\),由于 \(j'\) 要么等于 \(j_u\) 要么等于 \(j_v+1\),可以讨论等于哪个,另一个的范围对应是一个前缀/后缀最大值。

复杂度 \(\Theta(n^2)\)。

标签:子树,p4845,中灯,solution,ex,照亮,闲置,最远
From: https://www.cnblogs.com/iorit/p/18052648

相关文章

  • p4632-solution
    P4632Solutionlink对时间扫描线,就变成支持单点加入删除一个颜色点,求所有颜色距离某个点的距离最大值。考虑二分答案,现在就是要检验\([x-mid,x+mid]\)内是否有\(1\simk\)颜色的点各至少一个。数颜色可以考虑维护\(pre_i\)表示上一个与该点同色的位置。然后区间\([l,r]......
  • p4555-solution
    P4555Solutionlink双回文串的左右两半部分显然是互相独立的。于是考虑求出\(lm_i\)表示以\(i\)结尾的最长回文子串长度,\(rm_i\)表示以\(i\)开头的最长回文子串长度,最后扫一遍所有的分隔符求\(lm+rm\)的最大值即可。考虑如何求\(lm,rm\)。先用manacher拉出\(p\),......
  • Solution - 消息传递
    Link。首先我们假设在看本文章的所有人除了@左乐都已经使用点分树A掉了震波。然后我们要怎么简单修改A掉这个消息传递呢。震波是维护距离\(\leqk\)的点,这里只需要维护\(=k\)的,显然我们可以改掉维护前缀和的那个数据结构(比如树状数组),直接用普通数组/vector。跳......
  • p4137-solution
    P4137Solutionlink考虑建主席树:权值线段树的叶子维护这个权值最后出现的下标,push_up的时候取\(\min\)。这样一个区间的\(\min\)小于\(k\)意味着有一个权值最后出现的下标小于\(k\),也就是说\(k\)后面没有出现这个权值。也就是说mex就在这个区间内。这样询问的时候......
  • p3990-solution
    P3990Solutionlink一次只能跳一步的情况下:\(dp_{i,j}=dp_{i-1,j-1}+dp_{i-1,j}+dp_{i-1,j+1}\)接下来考虑能跳奇数步:你发现跳\(3\)步相当于先跳一个奇数\(1\)再跳一个\(2\),跳\(5\)步相当于先跳一个奇数\(3\)再跳一个\(2\)也就是说能够一步跳到\((i,j)\)的一定能......
  • p3773-solution
    P3773Solutionlink\[\binomnm\bmod2=\binom{n\bmod2}{m\bmod2}\binom{n/2}{m/2}\bmod2\]我们要让\(\binomnm\bmod2\)不为\(0\),也就是让右式的两项均不为\(0\)。考虑\(\binom{n\bmod2}{m\bmod2}\):\(n\bmod2\)和\(m\bmod2\)的取值要么是\(0\)要么是\(1\)......
  • p3768-solution
    P3768Solutionlink\(\begin{aligned}\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)&=\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^nijd[\gcd(i,j)=d]\\&=\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij[......
  • p3435-solution
    P3435Solutionlink画个图:显然四个黄色部分是相等的。也就是说,黄色部分是A的一个border。根据题目,周期的长度也就是Q的长度,也就是A的长度减去它的某个border的长度。现在要求这个最大,由于A的长度固定,要求的也就是A的最小border长度。根据KMP求出来的nxt......
  • p3426-solution
    P3426Solutionlink考虑dp。设\(dp_i\)表示至\(i\)的字符串的答案。KMP求出nxt数组,那么显然\(dp_i\)要么等于\(i\)要么等于\(dp_{nxt_i}\)。什么时候\(dp_i\)等于\(dp_{nxt_i}\)呢?这时这个字符串一定由一个与\(nxt_i\)有相同\(dp\)值的前缀再印上一个bo......
  • p3306-solution
    P3306Solutionlink\(x_{i+1}\equiva\timesx_i+b\pmodp\)\(x_{i+1}\equiva(ax_{i-1}+b)+b\pmodp\)\(x_{i+1}\equiva(a(ax_{i-2}+b)+b)+b\pmodp\)\(...\)\(\displaystylex_{i+1}\equiva^ix_1+b\sum\limits_{j=0}^{i-1}a^j\pmodp\)即......