CF1499F - Diameter Cut
题意:对于一棵树,有多少种删去边的方式,使得删边之后得到的森林中,每棵树的直径都不超过
见数据范围和直径知
同时注意每棵树转移到祖先的时候,
下面我们默认转移时使用的
然后考虑转移,首先,对于
其次我们这里是找到了所有深度不大于
然后,对于
显然后面的东西可以用前缀后缀预处理出来,也就是我们可以处理
到这里我们就做完了题目,时间复杂度
首先,习惯乱开 long long
的要关掉,做乘法的时候先乘 1ll
再运算,强转一下死不了人的。这样空间就是 400MB
。
然后我们发现,2500
就够了,300MB
。
最后,我们发现上述过程,200MB
。到这里就可以过了。
我们再次发现,100MB
了,稳过,开 long long
也行。
const int P=998244353;
int n,k,dp[5005][5005],a,b;
vt<int>vv[5005];
int lis[5005],sz;
int sum[5005];
int suf[5005];
inline void dfs(int x,int p){
for(auto j:vv[x])if(j!=p)dfs(j,x);
sz=0;
for(auto j:vv[x])if(j!=p)lis[++sz]=j;
rep(j,0,k/2){
dp[x][j]=1;
rep(i,1,sz)dp[x][j]=1ll*dp[x][j]*dp[lis[i]][j]%P;
}
rep(j,k/2+1,k){
dp[x][j]=dp[x][j-1];
suf[sz+1]=1;
per(i,1,sz)suf[i]=1ll*suf[i+1]*dp[lis[i]][k-j]%P;
ll pre=1;
rep(i,1,sz){
dp[x][j]=(dp[x][j]+(dp[lis[i]][j]-dp[lis[i]][j-1]+P)%P*1ll*pre%P*suf[i+1]%P)%P;
pre=1ll*pre*dp[lis[i]][k-j]%P;
}
}int sum=dp[x][k];
per(i,1,k+1)dp[x][i]=(dp[x][i-1]+sum)%P;
dp[x][0]=sum;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
rp(i,n-1){
cin>>a>>b;
vv[a].pb(b);
vv[b].pb(a);
}
dfs(1,0);
cout<<(dp[1][k+1]-dp[1][0]+P)%P<<endl;
return 0;
}
//Crayan_r
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话