当前位置: 首页 > news >正文

杭电多校10 : 1007 小塔的魔法树

在这里插入图片描述
感觉这是一道值得收藏的题目。

比赛的时候这道题看到后没有立即想到思路,虽然不算很难,但还是比较初见杀的。

比较常见的思路是采用树形dp,用 d p [ x ] [ y ] dp[x][y] dp[x][y]表示点 x x x的子树中选择了和为 y y y的联通块的方案数。

这样将两个合并是

d p ′ [ x ] [ t ] = ∑ i = 0 t d p [ x ] [ i ] × d p [ y ] [ t − i ] dp'[x][t]=\sum_{i=0}^tdp[x][i]\times dp[y][t-i] dp[x][t]=i=0tdp[x][i]×dp[y][ti]

这样的转移是 O ( n log ⁡ n ) O(n\log n) O(nlogn)的。

感觉树形dp主要的问题是不能很好的利用只有一个连通块的条件。

后面想着如果是一个连通块,直接用在dfs序上面找不选的点就好。

d p [ i ] [ j ] dp[i][j] dp[i][j]表示在dfs序为 i i i的点上和为 j j j的方案数(只是到 i i i并没有决定 i i i选不选)

那么就有两种方案,如果选择 i i i,就把 d p [ i ] dp[i] dp[i]加到 d p [ i + 1 ] dp[i+1] dp[i+1];如果不选择 i i i,那么其子树就不用再去遍历,直接给 d p [ i + s i z [ i ] ] dp[i+siz[i]] dp[i+siz[i]]加上 d p [ i ] dp[i] dp[i]即可。

#include <bits/stdc++.h>
#define ll long long
using namespace std;const int N = 5e3 + 10, mod = 1e9 + 7;int n, m, a[N], f[N][N];
vector<int> e[N];
int z, pos[N], L[N], R[N];void dfs(int x, int fa) {L[x] = ++z;pos[z] = x;for (int y : e[x]) {if (y == fa) continue;dfs(y, x);}R[x] = z;
}void ad(int &x, int y) {x = x + y >= mod ? x + y - mod : x + y;
}void solve() {cin >> n >> m;memset(f, 0, sizeof(f));for (int i = 1; i <= n; i++) {cin >> a[i];e[i].clear();}for (int i = 1; i < n; i++) {int x, y;cin >> x >> y;e[x].push_back(y);e[y].push_back(x);}z = 0; dfs(1, 0);f[1][0] = 1;for (int i = 1; i <= n; i++) {//选择for (int j = 0; j + a[pos[i]] <= m; j++) {ad(f[i + 1][j + a[pos[i]]], f[i][j]);}//不选择if (i > 1) {int k = R[pos[i]] + 1;for (int j = 0; j <= m; j++) {ad(f[k][j], f[i][j]);}}}int ans = 0;for (int i = 0; i <= m; i++) {ad(ans, f[n + 1][i]);}cout << ans << "\n";
}int main() {// freopen("in.in", "r", stdin);ios::sync_with_stdio(false);cin.tie(nullptr);int T; cin >> T;while (T--) {solve();}
}

相关文章:

  • 分糖果--思维+while判断
  • CSS- 4.2 相对定位(position: relative)
  • 前端基础之CSS
  • 【001】RenPy打包安卓apk 流程源码级别分析
  • (面试)TCP、UDP协议
  • 手写tomcat:基本功能实现(4)
  • 轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
  • Git 版本控制系统入门指南
  • 我的世界模组开发——特征(2)
  • 使用 Vue Tour 封装一个统一的页面引导组件
  • Typescript学习教程,从入门到精通,TypeScript 函数语法知识点及案例代码(5)
  • 六、绘制图片
  • Golang 范型
  • C# WPF .NET Core和.NET5之后引用System.Windows.Forms的解决方案
  • 数据库——SQL约束窗口函数介绍
  • 量化用到的机器学习书籍推荐
  • 广和通L610模块通过AT指令访问服务器方案:嵌赛使用
  • QT6 源(105)篇二:阅读与注释 QAction,给出源代码
  • RJ连接器的未来:它还会是网络连接的主流标准吗?
  • Java-Objects类高效应用的全面指南
  • 林诗栋/蒯曼混双取胜,国乒赢得多哈世乒赛开门红
  • 江西4人拟任县(市、区)委书记,其中一人为“80后”
  • 长期吃太饱,身体会发生什么变化?
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起
  • 沪喀同心|为新疆青少年提供科普大餐,“小小博物家(喀什版)”启动
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超