CF1039D You Are Given a Tree (树形 dp + 贪心 + 根号分治)
树形 dp + 贪心 + 根号分治
题目是一个经典问题,可以用树形 dp 和贪心解决。设
否则
如果每个
我们发现,随着
结合上答案的单调性,不难想到二分每个段的右端点,这样复杂度为
而对于
设这个值为
所以总复杂度为
- 链式前向星存边
- 快读快写
- 一遍 dfs 后将树拍成 dfs 序后倒着遍历,这也是最关键的卡常的地方。
#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define mk std::make_pair
#define fi first
#define se second
#define pb push_back
using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 1e5 + 10;
int n, ans, k, g, tot, cnt;
int dfn[N], fat[N], mx[N], dmx[N];
struct node {
int to, nxt;
} e[N << 1];
int f[N], h[N];
void add(int u, int v) {
e[++cnt].to = v;
e[cnt].nxt = h[u];
h[u] = cnt;
}
void dfs(int u, int fa) {
dfn[++tot] = u;
fat[u] = fa;
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v == fa) continue;
dfs(v, u);
}
}
void dfs2() {
for(int i = tot; i >= 1; i--) {
int u = dfn[i];
if(f[mx[u]] + f[dmx[u]] + 1 >= k) ans++, f[u] = 0;
else f[u] = f[mx[u]] + 1;
int fa = fat[u];
if(f[mx[fa]] < f[u]) dmx[fa] = mx[fa], mx[fa] = u;
else if(f[dmx[fa]] < f[u]) dmx[fa] = u;
}
}
bool check(int x) {
for(int i = 1; i <= n; i++) f[i] = mx[i] = dmx[i] = 0;
k = x, ans = 0;
dfs2();
if(ans == g) return 1;
return 0;
}
int main() {
scanf("%d", &n);
for (int i = 1; i < n; i++) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v), add(v, u);
}
dfs(1, 0);
int n1 = n, m = 0;
while(n1) n1 >>= 1, m++;
m++;
m = sqrt(1LL * n * m);
for (int i = 1; i <= n; i++) {
k = i;
if(i <= m) {
for (int j = 1; j <= n; j++) f[j] = mx[j] = dmx[j] = 0;
dfs2();
printf("%d\n", ans);
} else {
for (int j = 1; j <= n; j++) f[j] = mx[j] = dmx[j] = 0;
dfs2(); g = ans;
int l = i, r = n, mx = i;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) l = mid + 1, mx = mid;
else r = mid - 1;
}
for (int j = i; j <= mx; j++) printf("%d\n", g);
i = mx;
}
ans = 0;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具