main
黄海 2 years ago
parent ddc0e0ac7d
commit 6b3ea6568a

@ -0,0 +1 @@
<mxfile host="Electron" modified="2024-01-16T01:50:06.809Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.9.6 Chrome/89.0.4389.128 Electron/12.0.16 Safari/537.36" etag="i9pExtN7YpJqP0ppEYJ2" version="14.9.6" type="device"><diagram name="第 1 页" id="ks3JcnyIYbunu46MognX">7Vptc6M2EP41+tgOSIiXj2Dju+lcZzqTD+n1G2dkmxYjF8uxc7++KyHeLOKSHE6YaTOJB61Wu6tndx8QDiKL/eVTmRx2v/KU5Qhb6QWRJcLYdjBG8tdKnyuJT7RgW2apVmoFD9l3poWWlp6ylB17ioLzXGSHvnDNi4KtRU+WlCU/99U2PO97PSRbZgge1kluSh+zVOy01HaDduIzy7Y77drHXjWxT2plvZPjLkn5uSMiMSKLknNRXe0vC5ZL8GpcqnWrF2abwEpWiDEL/nh4XD3a6an8sov8X+Jl+vnw9081zEfxXO+45KciZXKRhUjES7HjW14k+RfODyC0QfgnE+JZ5yo5CQ6indjnepZdMvG7XP4z1aOvnZnlRVtWg+d6UIjyubNIDr9259plalSvO4qS/9VkRvowYdFIHfmpXLNbWOjySsotEzf0SKXH0l7laNA/Mb5nECEolCxPRPbUL6RE1+O20WtTBhc6a6/JoD2PDN4fd2deuFd2n5L81PfUSQSYAZ6CQXTeZYI9HBIFxBmosg94cjxU5LXJLjJx0YYXQqcHS4VNlucLnvNSGSYr+AmCW6g/sVKwy02c6llfc4BmaFcPzy3dUS3adYiulk0PLJ5HQb+Vkt7eCGRkI9B5NQL5P1+38+XOKl/EIC6z4e5IXJHthxMRl9UnLvvDmcv5r3aCM7ITvFl1gk3vkK+psf9XTP2pMdVLf+MZhNJ0G/Zor9uaE1ptoioSveoqM00Yb0+WY9CWed+ZjrYmoKeGZ+ZCT9RA0OSrWSF4BSD2PhhA1wDQJJBZAWg7dF4IegaC7rwRxNbMEPQNBL2ZIxjMDEHbbGMbxQTBMdiHC4qiJQoIigMlCVDsoMhHIQAW+wieXX2MYk9+RjDnosBDkYviFYoWyF8onRhFnjIUy1lQDmCVo5SXyCdyCkyDPgY97Oaw4+hbCVdbeYXHBIPvEQwxgyFjgnHuEYxtBuOMCYa+UzCmhI4Jj7xT4twxwbjvhJU3JhjvwxJ3/I4oFBddKlrEbrKXPFl8Ox6UujVOtOkbGfJBp/BBb/twp/Dh3vbhTeHDu+0DV9Pkh3y0RmQlwB8Bfhj2R6bwR8b7sytV74f8tUai1mf3GvAduMW8EFKmrIWqIyMU0kz3ZhTK3got1ZFNt1HoWRRYeiqwm0ZWjbhQrQ06jtSXzdrVCYd6vaIIbAa36cbWBOIif4nCeKDtwTbIQ1vaDiuOoNJboJQBnYC+jkdeDm1AIr2vlB3FWYHaa7RCQdDZvemii2usVjlymxpFxZqV5bAi0YUCj8q9wNZafqTSrL/SvsB461QxboBrDsY3nTYGm2Q2iWpcwJQK6bo4ZVig4esCCCOlGul9SlBclZvqjvAyuAMwOfJTXwQyhXqfsUK5MliH1Sta8K5SC5qAppaoCH0qa6KLIDSOBNeV4IJNadlVKLuyYmC2p2wpidMmO8RqyyoxEEC3sMKFyl9j2a0DazqlQePqoR4et0X/6b367rN+uVrwQj7xd9+3alGSZ9sChjnbSAvy0T1bJ3moxUK+2Ro8KfRfhnXOBrZfj3V8A19Gv/qg4Fwd9wPznOBZQweF6xdRI04KMGy/eK/eULX/vkDifwA=</diagram></mxfile>

@ -0,0 +1 @@
<mxfile host="Electron" modified="2024-01-16T01:47:48.408Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.9.6 Chrome/89.0.4389.128 Electron/12.0.16 Safari/537.36" etag="s-y3bA8o-X7vyHd2Wbe6" version="14.9.6" type="device"><diagram name="第 1 页" id="ks3JcnyIYbunu46MognX">7Vptb9s2EP41/JhBFPX6UbLlFkMHbMuAtP3GWLSlVhZVio7t/vqREvXCyPFUVJoFbEEQ847HO95zx/OJCkCrw/kdw0XyG41JBkwjPgO0BqYJLdME8teILzXHQ4qxZ2mshDrGY/qdKKahuMc0JqUmyCnNeFrozC3Nc7LlGg8zRk+62I5mutUC78mA8bjF2ZD7lMY8UVzo+N3Ee5LuE2XaM9164oAbYeVJmeCYnnosFAG0YpTyenQ4r0gmwWtwqddt3phtN8ZIzscs+Pz4tHmC8ZF9SELv12gdvy++PTQwl/zSeMzoMY+JXGQAFFLGE7qnOc4+UFoIJhTML4Tzi4oVPnIqWAk/ZGqWnFP+US2X40+98frcJy6KKDmjX1t8YcXBjAcyfoLxnNHt14a5SbPWUB43IjnNSc1R81LtECEFWkmPbEtuwVLLkVhLDoXrO0IPhLOLEGAkwzx90XMFq5Tbt3Lt0t9pKrZiGs3xMO16yaVJekNXIRzeE65WdbEVg942OlYV8R+JPpwv+rAXfXgz+j8dphqlG3LW1OHUAvHDqNd6X3B21C31wiDUiAonU/qUpJw8FrgC4iSKrA43Lou67O3SswxbuKM5V8ExpcBOnIcVzSirFKON+PH9W6i/EMbJ+SZOatZ0DT19PUWfukppK1bSq5G2MRey5ozV7Bd7dEYLSNmlt0iSn/pz3bKK+vmTgEaeBHtZJwH9H6/b8XIWFS80qFzDAzdj5QqhF0xTudov2oteke5WuKz/6kGwRh4Ed1EHAdozxGtq7P8RU+/f6XKRpR+2lm5U1EkyW5drDarW8Gtnuqo1QXVCUH8sMP07lyd7gOCwXi0KQVvPuLZRvReAzgDAYQFZFIDQspeFoDtA0Fk2gq8fjizjzgh6AwTdZSOInPsh+MfLl2PygLh/8k4BNsq/Pv6Jrjy4g8gG4Rr4CEQWCEMQ2GY18kAYgMgBgQFCXw58F4QiYZ1M7DF8ZhrqzrejvAOsIHwoKwwDIQC94lwB2cyL0V59TqEGgggB8cTuwZ4XfsXxlRPBWrjjAdF1e2Lgyr99d6INCFfAW1UyEQjdSlEkZ4WwL1ZZlfAaeEhOCdVC3hRy03hgjvHAmsMDOJEHaIwH9pI9sMZ4AOfwwJrIA3uMB2gOD9BEHjhjPHCWnEXuGA/cJXuwLDXld2CLA2Kvq69r09hp5HQmbN1ERzr4IDuG/LksJvbK0U06M3jl6ibcGUygWidSJlBrQiakIJGo+hOag7V+S5mDr83JaorW/pQmzdqGq0x2ZNgmYz20uyHshJq9+XKf3mSn61W/KzpRrje29avI5tpRvVbs30QqFs7SfS7IjOykBtnVplucBYrN5aXP1SZavyfqtc3CS0Wr/b3VMF9pq99+EIZ6D33lMc5BV3po6/WbyBFNtCC7t9n15U33PwEo+hs=</diagram></mxfile>

@ -318,43 +318,6 @@ int main() {
}
```
#### [$CF1187E$ $Tree$ $Painting$](https://www.luogu.com.cn/problem/CF1187E)
**题意**
给定一棵 $n$ 个点的树,初始全是白点
要求你做 $n$ 步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值。
第一次操作可以任意选点。
求可获得的最大权值。
**题解**
分析一下题目性质,发现一旦选定初始点,不管我们之后扩展的顺序是怎样的,得到的权值都不会变(这个性质画画图很容易就可以发现)。
现在问题又转变成选择一个初始点,最大化从它扩展到全树所得的价值,**经典二次扫描换根问题**。
考虑每个结点,假设要扩展这个结点,可以得到多少权值,设这个值为 \(sum[x]\),另外,设以 \(x\) 为根的子树大小为 \(siz[x]\) 。
那么很简单的,可以得到转移方程:
\[sum[x]=\sum_{y\in Son(x)}siz[y]+siz[x] \]
我们利用这个方程,求出任意一个结点为根时的 \(sum\) 值,然后进行换根,假设现在求出了 \(sum[1]\) 。
请看下图
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401151554158.png)
假设我们现在把根从 1 换到 4 ,然后扩展,那么我们多得到的权值就是 {1,2,3,5,6} 这个连通块的价值,但是同样我们失去了 {4,9,7,8} 这个连通块的价值。
因为我们是 dfs 进行转移,于是我们可以从父亲到儿子推出转移方程:
\[sum[y]=sum[x]-sum[y]+n-sum[y],y\in Son(x) \]
也就是说,我们从父亲转移到儿子的时候,得到了这个儿子子树大小的价值,损失了非该儿子子树的价值。
-----------------------------------
二次扫描与换根法
#### [$P2986$ 伟大的奶牛聚集](https://www.luogu.com.cn/problem/P2986)
**题目描述**
@ -436,6 +399,186 @@ signed main() {
```
#### [$CF1187E$ $Tree$ $Painting$](https://www.luogu.com.cn/problem/CF1187E)
https://www.luogu.com.cn/blog/defKaeru/solution-cf1187e
**题意**
给定一棵有 $n$ 个结点的无根树,所有结点都是白色的。
第一次操作可以 <font size=5 color='red'><b>随意</b></font> 使一个结点染成黑色,之后每次操作可以使一个与黑色结点相邻的白色结点变成黑色。
**每次操作可以获得的权值为**: 被染成黑色的白色结点所在的白色连通块的结点数量。
求可以获得的最大权值。
**难点解析**
最初时,我对这个**权值** 的认识不够深入,没有明白为什么根不同权值就会不同呢?后来仔细思考,发现是自己傻了,因为根不同,每个节点到根的距离就会不同,而权值的计算办法,其实是类似于哈夫曼树,父子隶属关系的不同最终的权值是不一样的,我们可以再画一下上面的图进行深入理解:
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401160950270.png)
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401160947763.png)
**总结**:这个理解能力,目前看来有两种办法:
- ① 多动手画图理解,尝试换根试一下。
- ② 多做题,做的多了就一下明白它说什么了。
**题解**
不难发现只要选定了第一个被染色的结点,答案也就确定了, 也就是 选了谁是根最重要,其它的选择顺序不重要。
所以有一个朴素做法就是以枚举每个结点为根,都做一次树形$dp$。
以某一结点为根,记 $f_i$ 表示以 $i$ 为根的子树中,首先把 $i$ 染成黑色的答案。
方程就是
$\displaystyle \large f[u]=sz[u]+\sum_{v \in son[u]} f[v]$
其中
$sz[u]$ 表示以 $u$ 为根的子树大小,也就是染色时的白色连通块大小。
**时间复杂度**
$O(n^2)$ ,稳稳地暴毙,然后就会自然而然地想到换根$dp$。
**换根$dp$**
先考虑以任意一点为根,不妨记为 $1$ ,求出 $f$ 数组。
然后记 $g[i]$ 表示以 $i$ 结点为根时的答案,尝试通过$1$号节点的计算已知值,进行换根,利用数学变换加快运算速度。
显然,由于1号节点是根它没有向上走的路径所以它的向下所有获取的价值就是总价值也就是 $g[1] =f[1]$
然后考虑 $g$ 数组从 **父亲到儿子** 的转移。
以样例为例:
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401151619931.png)
我们假设当前以 $1$ 号为根,求出了 $f$ 数组,也就是知道了 $g[1]=f[1]$ ,然后要求出 $g[2]$ 。
考虑一下答案的组成。
首先考虑 $2$ 号结点的孩子的贡献,也就是图中蓝圈内的部分。这部分显然不会改变,贡献就是 $f[2] sz[2]$ 。
然后考虑父亲方向,也就是图中红圈部分对 $g[2]$ 的贡献。
那么除了以 $2$ 号结点,与 $1$ 号结点相邻的其他子树都会对答案产生贡献,也就是说,我们只需要用以 $1$ 号结点为根时的权值减去以
$2$ 为根的子树的贡献即可,也就是 $g[1]-f[2]-sz[2]$ 。
不要忘了加上
<EFBFBD>
n ,也就是初始的白色连通块大小。
综合一下上述两种方向的贡献,可以得到:
<EFBFBD>
2
=
(
<EFBFBD>
2
<EFBFBD>
<EFBFBD>
<EFBFBD>
2
)
+
(
<EFBFBD>
1
<EFBFBD>
2
<EFBFBD>
<EFBFBD>
<EFBFBD>
2
)
+
<EFBFBD>
=
<EFBFBD>
1
+
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
2
×
2
g
2
=(f
2
siz
2
)+(g
1
f
2
siz
2
)+n=g
1
+nsiz
2
×2 。
推广到所有结点,就可以得到:
<EFBFBD>
<EFBFBD>
=
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
+
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
×
2
g
u
=g
father
u
+nsiz
u
×2
然后跑两遍 dfs 就愉快的解决啦。
#### [$CF1324F$.$Maximum$ $White$ $Subtree$](https://www.luogu.com.cn/problem/CF1324F)
**题目大意**

Loading…
Cancel
Save