专栏文章

P12777 题解

P12777题解参与者 2已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@minaqs61
此快照首次捕获于
2025/12/01 23:20
3 个月前
此快照最后确认于
2025/12/01 23:20
3 个月前
查看原文
这个 DP 的样式非常奇诡。——LCA
LCA 模拟赛题,太困难了。基本是复述 LCA 给的题解。

题意

给出一个森林,点有点权 aua_u,边有边权 bub_u。标记一个点需要花费 aua_u 的代价,若其父亲已被标记,也可以花费 bub_u 的代价。标记随时可清除,且不能同时存在超过 kk 个标记点。要求树上的 mm 个点均被标记过,求最小代价。多组数据,T30,mn5000,k5T\le 30,m\le n\le 5000,k\le 5原题
弱化版:每个点只能被标记一次,T5,mn105,k10T\le 5,m\le n\le 10^5,k\le 10

题解

判掉 k=1k=1,此时答案为 a\sum a;将 bib_iaia_imin\min,同时以 00 为树根且不标记,避免讨论。考虑标记点形态,k=2k=2 时标记 uu 点后可向下拓展到子节点,但是需要清除 uu 点标记才能接着向下,最终能覆盖毛毛虫形状内的点。定义单点是 11 合法的,对于 i>1i\gt 1,定义 uu 子树 ii 合法当且仅当存在一个儿子 ii 合法, 且其他儿子均 (i1)(i-1) 合法,这也能解释 22 合法的形状。
于是对于弱化版,设 fu,if_{u,i} 表示 uu 子树内关键点均被标记过,且从 uu 开始的拓展过程 ii 合法的最小代价。状态不考虑 uu 点代价,因为其取值受父亲影响。另外令 fu,0f_{u,0} 表示 uu 不选时的最小代价。转移为 fu,1=fu,0=min(fv,k+av,fv,0)f_{u,1}=f_{u,0}=\sum\min(f_{v,k}+a_v,f_{v,0}),对于 i>1i\gt 1,有 fu,i=min(fv,i+bv+tvmin(ft,i1+bt,ft,k+at,ft,0))f_{u,i}=\min(f_{v,i}+b_v+\sum_{t\ne v}\min(f_{t,i-1}+b_t,f_{t,k}+a_t,f_{t,0})),只需先对第二个式子求和,再找最优差值更新即可。最后若 uu 必须被标记,将 fu,0f_{u,0} 赋为正无穷,复杂度 O(nk)\mathcal O(nk)
对于原题,同一个点可被学习多次,即可以从 uu 拓展到 vv,在 vv 拓展的过程中扔掉 uu,之后需要标记 vv 或其他子节点时再把 uu 标记回来。据此设 fu,i,jf_{u,i,j} 表示考虑 uu 子树,用到了至多 ii 的空间,过程中 uu 的子节点拓展需要 uu 点标记 jj 次的最小花费。与上面相同,状态不考虑 uu 点代价,这会在父亲节点上决策。
这个状态在定义什么?其包含子树内其他点的标记次数和方式,记录过程中的最大空间消耗和 uu 用于拓展的标记次数,以便向上转移。由于空间越大越可操作,fu,i,jf_{u,i,j}ii 增大单调不增。另外 fu,i,0f_{u,i,0} 并非不标记 uu,而是已经考虑的过程没有用 uu 拓展,还没有因此标记过 uu。最终 fu,i,0f_{u,i,0} 的值是无意义的,事实上代表的是 i<ii'\lt ifu,i,yf_{u,i',y},该状态也不能转移给父亲。至于真的不标记,再设 gug_u 表示 uu 不用于拓展时子树内最小代价,此时子树内其他拓展过程均可使用 kk 的空间,不用记录。
由于从某点开始同时向多个子树拓展不优,可以依次处理每个子树,这样可用空间更大。于是可依次将每个子树 vv 的信息拼到 uu 上。具体地,新拼上一个子树 vv 时,有以下几种转移(tvt_v 表示 vv 是否需要标记;均有限制 i2,j0,y1i\ge 2,j\ge 0,y\ge 1):
  1. vvuu 拓展来,且拓展过程中一直保留 uuvv 标记 yy 次:fu,i,j+fv,i1,y+ybvfu,i,jf_{u,i,j}+f_{v,i-1,y}+yb_v\rightarrow f'_{u,i,j}
  2. vvuu 拓展来,且 vv 不用于向下拓展:fu,i,j+gv+tvbvfu,i,jf_{u,i,j}+g_v+t_vb_v\rightarrow f'_{u,i,j}
  3. vv 部分从 uu 拓展来,过程中扔掉 uuvv 标记 yy 次,其中 xx 次从 uu 拓展:fu,i,j+fv,i,y+xbv+(yx)avfu,i,j+xf_{u,i,j}+f_{v,i,y}+xb_v+(y-x)a_v\rightarrow f'_{u,i,j+x},有限制 0xy0\le x\le y
  4. vv 不从 uu 拓展,标记 yy 次:fu,i,j+fv,k,y+yavfu,i,jf_{u,i,j}+f_{v,k,y}+ya_v\rightarrow f'_{u,i,j}vv 不标记代价为 gv+tvavg_v+t_va_v,不如 2 优。
  5. uu 不向下拓展,vv 标记 yy 次:gu+fv,k,y+yavgug_u+f_{v,k,y}+ya_v\rightarrow g'_uvv 不标记:gu+gv+tvavgug_u+g_v+t_va_v\rightarrow g'_u
最难理解的可能是转移 3,即 vv 用了全部的 ii 空间,此时每次从 uu 拓展都要重新标记 uu。这里状态第三维记录的是用于拓展的标记次数,理解了这一转移大概就能理解状态设计的方式了。
至于初始值,开始的时候只有单点 uu,所有值均为 00fu,1f_{u,1} 没有转移,注意到此时 uu 同样不能向下拓展,全部赋成 gug_u 即可。暴力实现的话,转移 2.4.5 的复杂度不超过 O(n2k)\mathcal O(n^2k),可以接受;而转移 1 是 O(n3k)\mathcal O(n^3k) 的,转移 3 不限制上下界是 O(n4k)\mathcal O(n^4k) 的,均需优化。
对于转移 1,注意到是对所有 yy 取最小值,于是设 hi=min(fv,i,y+ybv)h_{i}=\min(f_{v,i,y}+yb_v),转移就变成了 fu,i,j+hi1fu,i,jf_{u,i,j}+h_{i-1}\rightarrow f'_{u,i,j}。这样转移和 hh 的预处理都是 O(n2k)\mathcal O(n^2k) 的了,可以接受。
对于转移 3,注意到下标变化只与 xx 有关,先用同样方法避免掉 yy 的枚举。具体地,对于确定的 i,j,xi,j,x,会用 yxy\ge xfv,i,y+xbv+(yx)avf_{v,i,y}+xb_v+(y-x)a_v 转移。将 yy 分离出来得到 fv,i,y+yavf_{v,i,y}+ya_v,预处理其后缀最大值 hi,yh_{i,y} 即可,复杂度同样是 O(n2k)\mathcal O(n^2k) 的。之后转移为 fu,i,j+hi,y+x(bvav)fu,i,j+xf_{u,i,j}+h_{i,y}+x(b_v-a_v)\rightarrow f'_{u,i,j+x}。注意到 jj 一维显然不会超过子树大小,可以套用树形背包,复杂度就是 O(n2k)\mathcal O(n^2k) 的了。
于是做到了 O(n2k)\mathcal O(n^2k) 的时空复杂度, 单组数据就能过了。然而原题是 3030 组多测,根本不是人。不过还有常数优化!考虑一次 ii 合法的拓展,若新覆盖的点数少于 ii,则其一定也是 (i1)(i-1) 合法的,可以将其拼到某次 ii 合法的拓展上。因此一次 ii 合法的拓展至少新覆盖 ii 个点,于是 fu,i,jf_{u,i,j}jj 一维可限制 jsuij\le \lceil\frac {s_u} i\rceil。加上这个常数大大减小,可以通过。

代码

评论

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

正在加载评论...