[HDU 5909] Tree Cutting
考虑暴力 dp:设
这个暴力慢在合并两个儿子的状态,因为合并两个 dp 数组是
重新考虑连通块这个限制,其实就是对于每个点
进一步优化,只需点分治优化枚举根的过程即可。
#include <bits/stdc++.h>
using namespace std;
int read() {
int s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
f = (ch == '-' ? -1 : 1), ch = getchar();
while (ch >= '0' && ch <= '9')
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * f;
}
const int mod = 1000000007;
int n, m, k;
int a[1005];
int head[1005], to[2005], nxt[2005], tot = 0;
int ht, Maxp, sz[1005];
bool f[1005];
int ans[1024], dfn[1005], rnk[1005], timer = 0;
int dp[1005][1024] = {{0}};
void add(int u, int v) {
to[++tot] = v, nxt[tot] = head[u], head[u] = tot;
}
void H(int p, int fa, int SZ) {
int maxp = 0;
sz[p] = 1;
for (int i = head[p]; i; i = nxt[i])
if (to[i] != fa && !f[to[i]])
H(to[i], p, SZ), sz[p] += sz[to[i]], maxp = max(maxp, sz[to[i]]);
maxp = max(maxp, SZ - sz[p]);
if (maxp < Maxp)
Maxp = maxp, ht = p;
}
void dfs(int p, int fa) {
dfn[p] = ++timer, rnk[timer] = p, sz[p] = 1;
for (int i = head[p]; i; i = nxt[i])
if (to[i] != fa && !f[to[i]])
dfs(to[i], p), sz[p] += sz[to[i]];
}
void Solve(int rt) {
Maxp = 1e9, H(rt, 0, sz[rt]), rt = ht;
timer = 0, dfs(rt, 0);
dp[2][a[rt]] = 1;
for (int i = 2; i <= timer; i++)
for (int j = 0; j < m; j++) {
dp[i + 1][j ^ a[rnk[i]]] = (dp[i + 1][j ^ a[rnk[i]]] + dp[i][j]) % mod;
dp[i + sz[rnk[i]]][j] = (dp[i + sz[rnk[i]]][j] + dp[i][j]) % mod;
}
for (int i = 0; i < m; i++)
ans[i] = (ans[i] + dp[timer + 1][i]) % mod;
for (int i = 1; i <= timer + 1; i++)
for (int j = 0; j < m; j++)
dp[i][j] = 0;
f[rt] = true;
for (int i = head[rt]; i; i = nxt[i])
if (!f[to[i]])
Solve(to[i]);
}
void init() {
memset(f, 0, sizeof f);
memset(ans, 0, sizeof ans);
memset(head, 0, sizeof head);
tot = 0;
}
signed main() {
int T = read();
while (T--) {
init();
n = read(), m = read();
for (int i = 1; i <= n; i++)
a[i] = read();
for (int i = 1; i < n; i++) {
int u = read(), v = read();
add(u, v), add(v, u);
}
Solve(1);
for (int i = 0; i < m; i++) {
printf("%lld", ans[i]);
if (i < m - 1)
putchar(' ');
}
putchar('\n');
}
return 0;
}
作者:Galex
出处:https://www.cnblogs.com/Galetx/p/17265796.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探