首先考虑树的情况。其实也没有那么复杂:我们找到树的重心,那么这个点一定会被删除,否则存在分出来的连通块大小
<
n
2
<\frac{n}{2}
<2n,又因为重心没有被删掉所以存在连通块大小
>
n
2
>\frac{n}{2}
>2n,这样连通块大小之差显然就大于
1
1
1了。因此,不妨将重心作为树根。
先考虑
k
=
0
k=0
k=0的情况。假设我们已经知道了连通块的大小
t
t
t,那么我们通过比较子树和
t
t
t的大小关系就能知道那些点被删除了;应当注意到,
t
t
t应该是子树大小的因数,因此直接暴力跑就做完了。
我们考虑把这个做法搬到圆方树上面去。显然对于一个点双内的点,要么全部删掉,要么删掉的点的数目
≤
1
\le 1
≤1。不妨将问题做一些泛化 :设方点的点权为
0
0
0,原点的点权为
1
1
1,找到树的带权重心,显然在树上的推论仍然成立(这里有一个小小的推导过程:如果是圆点,那么可以看成这个原点向其他相邻的圆点连边,并且满足约束关系,显然这个点还是重心,因此这个点一定会被删掉;如果是方点,那么这个点双一定会被删掉,可以规约到以圆点为根的子树),总之套用树形
d
p
dp
dp即可解决。因此可以做到
O
(
n
n
)
O(n\sqrt{n})
O(nn)。
那么
k
=
1
k=1
k=1呢?应当注意到,当连通块数目为
x
x
x时,每个连通块的大小只能是
⌊
n
x
⌋
,
⌈
n
x
⌉
\lfloor\frac{n}{x}\rfloor,\lceil\frac{n}{x}\rceil
⌊xn⌋,⌈xn⌉两种情况,因此也不超过
n
\sqrt{n}
n。
还是考虑树的情况,因为我们已经枚举了
t
t
t因此事实上没有那么复杂,将子树大小和
t
t
t简单比较一下即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-04-08 【模板】有向图tarjan