P10037 「FAOI-R2」梨花开 (C) 题解
比较有意思的 dp 题。
思路#
考虑答案至少为
- 我们显然会把根节点的热量平均分配到深度前
小的点上,那么要求 。 - 其次,在热量到达前
小的点前, 不可以小于 。
只要满足了这两个条件,我们的答案就至少为
那么答案为:
如何求解。
设
在转移时可以判断一下是否合法即可。
转移可以用前缀和优化。
复杂度:
可以获得
发现我们的限制只和
因为操作只有
而根据整除分块,
复杂度:
视常数可以获得
容易发现我们满足前缀和不小于
那么我们可以进行预处理。
设
转移同样枚举下一位然后前缀和优化。
同样,我们想要仿造的求出
这是我们直接 dp 的后半段。
这个怎么求呢?
这类问题好像有一个比较常见的 trick。
就是在维护前缀和的最小值时,我们正着不好做,但是反过来是很好求的。
考虑反过来怎么求前缀和的最小值:
这个式子我们就可以 dp 了。
求出了
时间复杂度:
Code#
#include <bits/stdc++.h>
using namespace std;
#define eb(...) emplace_back(__VA_ARGS__)
#define fro(i, x, y) for (int i = (x); i <= (y); i++)
#define pre(i, x, y) for (int i = (x); i >= (y); i--)
const int N = 1e6 + 10;
const int mod = 998244353;
int n, m, t, k, ans, d[N], R[N], sm[N];
int dp1[510][30000];
int dp2[510][30000];
vector<int> to[N];
inline void dfs(int x, int f) {
d[x] = d[f] + 1;
for (auto i : to[x])
if (i != f) dfs(i, x);
}
inline void add(int&x, int y) {
x = (x + y >= mod ? x + y - mod : x + y);
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m >> t >> k;
fro(i, 1, n - 1) {
int u, v;
cin >> u >> v;
to[u].eb(v);
to[v].eb(u);
}
dfs(1, 0);
sort(d + 1, d + n + 1);
dp1[0][R[0] = 0] = dp2[0][R[0] = 0] = 1;
fro(i, 1, t) {
fro(j, 0, R[i - 1]) {
add(dp1[i][max(0, j - m)], dp1[i - 1][j]);
add(dp1[i][j + m + 1], mod - dp1[i - 1][j]);
add(dp2[i][max(0, j - m)], dp2[i - 1][j]);
add(dp2[i][j + m + 1], mod - dp2[i - 1][j]);
}
R[i] = R[i - 1] + m;
fro(j, 1, R[i] + 1) add(dp1[i][j], dp1[i][j - 1]);
fro(j, 1, R[i] + 1) add(dp2[i][j], dp2[i][j - 1]);
fro(j, 0, R[i - 1]) if (m - j > 0) add(dp2[i][0], 1ll * (m - j) * dp2[i - 1][j] % mod);
}
fro(i, 1, t) fro(j, 1, R[i]) add(dp2[i][j], dp2[i][j - 1]);
fro(i, 1, n) {
int v = k / i, p = min(t + 2, d[i]);
if (i == 1) {
sm[i] = dp2[t][min(v, R[t])];
} else if (v != k / (i - 1) || p != min(t + 2, d[i - 1])) {
int l = p - 2;
int r = t - p + 2;
fro(j, 0, R[l]) add(sm[i], 1ll * dp1[l][j] * dp2[r][min(v + j, R[r])] % mod);
} else sm[i] = sm[i - 1];
add(ans, sm[i]);
}
cout << ans << "\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)