[AGC008F] Black Radius
记 表示与 的距离不大于 的点构成的点集。
为了方便后面的讨论,先加入全集的贡献 。
当所有点均可选时,考虑如何不重的计算点集,
有些题解写的是: ,个人感觉是错的
结论应该是:相同的 中 最小的 唯一。
证明:
to be continued...
那么可以在相同点集时在最小的 对应的点 计算答案。
记 表示离 最远的点(最长链),显然有 (不能覆盖整棵树)
其次,若有 , 说明 的其它子树的深度
也就是说,对于任意 都有 ,当 所在子树即为最深子树时限制最紧,为次长链长度,记为
最终得到:
现在考虑部分点不可选,我们仍在 最小的点计算答案(即使 不可选)
现在需要保证 可以对应另一个 ,其中 是可选的。
充要条件是: 包含 的包含 的子树中的所有节点。
证明:
- 充分性
反证,若存在子树 没有被包含,显然
可知 , 矛盾- 必要性
取 便是一个合法的解。
可以使用换根 dp 解决。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 2e5 , Inf = 0x3f3f3f3f;
int n; char s[ MAXN + 5 ];
vector< int > Graph[ MAXN + 5 ];
ll ans;
int siz[ MAXN + 5 ] , d[ MAXN + 5 ]; //覆盖关键点的子树的最小 d
int mx1[ MAXN + 5 ] , mx2[ MAXN + 5 ]; //最长链,次长链
void dfs1( int u , int fa ) {
if( s[ u ] == '1' ) d[ u ] = 0 , siz[ u ] = 1;
else d[ u ] = Inf;
for( int v : Graph[ u ] ) if( v != fa ) {
dfs1( v , u ); siz[ u ] += siz[ v ];
if( mx1[ u ] < mx1[ v ] + 1 ) mx2[ u ] = mx1[ u ] , mx1[ u ] = mx1[ v ] + 1;
else if( mx2[ u ] < mx1[ v ] + 1 ) mx2[ u ] = mx1[ v ] + 1;
if( siz[ v ] ) d[ u ] = min( d[ u ] , mx1[ v ] + 1 );
}
}
void dfs2( int u , int fa ) {
int up = min( mx2[ u ] + 1 , mx1[ u ] - 1 );
if( d[ u ] <= up ) ans += up - d[ u ] + 1;
for( int v : Graph[ u ] ) if( v != fa ) {
int lu = ( mx1[ u ] == mx1[ v ] + 1 ) ? mx2[ u ] + 1 : mx1[ u ] + 1;
if( mx1[ v ] < lu ) mx2[ v ] = mx1[ v ] , mx1[ v ] = lu;
else if( mx2[ v ] < lu ) mx2[ v ] = lu;
if( siz[ 1 ] - siz[ v ] ) d[ v ] = min( d[ v ] , lu );
dfs2( v , u );
}
}
int main( ) {
// freopen("fire.in","r",stdin);
// freopen("fire.out","w",stdout);
scanf("%d",&n);
for( int i = 1 , u , v ; i < n ; i ++ ) {
scanf("%d %d",&u,&v);
Graph[ u ].push_back( v );
Graph[ v ].push_back( u );
}
scanf("%s", s + 1 );
dfs1( 1 , 0 ); dfs2( 1 , 0 );
printf("%lld\n", 1 + ans );
return 0;
}
分类:
动态规划-树形dp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通