Solution -「ARC 125F」Tree Degree Subset Sum
Link.
给定含有 个结点的树,求非负整数对 的数量,满足存在 ,其中 表示点 的度数。
。
方便期间,以下所有 表示 的度数 。
出题人莫名其妙告诉你一棵树,无非是强调 ,自然想到根号分治。不过朴素 DP 的状态数量就已经难以接受,我们需要更多的结论。
比如这个结论:
结论:若 且 均合法,那么 也合法。
证明
对于某个 ,取出最小 和最大的 ,使得 合法。设 中有 个值为 ,则我们只需证明 ,这是由于 的选取中必然不含 ,那么 都合法, 同理。考虑任意一个 ,令 ,那么
- ,显然;
- :,取等时 ,得证。
即 ,考虑将 和 代入,有 ,可以推出 ,故已有原命题成立。
所以,我们只需要对于每个 ,DP 求出 和 就能得到答案。DP 时根号分治,内部用单调队列优化即可。复杂度 。
/*~Rainybunny~*/
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef long long LL;
const int MAXN = 2e5;
int n, d[MAXN + 5], f[MAXN + 5], g[MAXN + 5];
inline void trans( const int v, const int c, const int r,
int* h, const auto& cmp ) { // cmp(a,b) is true <=> a is the better value.
static int que[MAXN + 5], th[MAXN + 5];
int hd = 1, tl = 0;
for ( int i = r; i <= n - 2; i += v ) {
th[i] = h[i];
while ( hd <= tl && que[hd] + c * v < i ) ++hd;
while ( hd <= tl
&& cmp( th[i] - i / v, th[que[tl]] - que[tl] / v ) ) --tl;
que[++tl] = i;
h[i] = th[que[hd]] + ( i - que[hd] ) / v;
}
}
int main() {
scanf( "%d", &n );
rep ( i, 1, n ) d[i] = -1;
rep ( i, 2, n ) {
int u, v; scanf( "%d %d", &u, &v );
++d[u], ++d[v];
}
std::sort( d + 1, d + n + 1 );
memset( f, 0x3f, sizeof f ), memset( g, 0xc0, sizeof g );
f[0] = g[0] = 0;
for ( int l = 1, r; l <= n; l = r + 1 ) {
for ( r = l; r < n && d[r + 1] == d[l]; ++r );
int v = d[l], c = r - l + 1;
if ( !v ) { g[0] = c; continue; }
rep ( r, 0, v - 1 ) {
trans( v, c, r, f,
[]( const int u, const int v ) { return u < v; } );
trans( v, c, r, g,
[]( const int u, const int v ) { return u > v; } );
}
}
LL ans = 0;
rep ( i, 0, n - 2 ) {
// printf( "%d: [%d,%d]\n", i, f[i], g[i] );
if ( f[i] <= g[i] ) ans += g[i] - f[i] + 1;
}
printf( "%lld\n", ans );
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-08-23 Solution -「LOCAL」Burning Flowers