【牛逼做法】P4186 Cow at Large
作者:互联网
-
题面 : click
-
题意 : 农场一颗无根树, 奶牛出现在位置 \(k\) 的谷仓, 有一些出口谷仓, 且其仅与一个谷仓相连。一开始所有出口谷仓都有一个农民, 奶牛农民每个单位时间内可以移动到相邻的谷仓。奶牛的目标是移动到一个出口谷仓, 如果农民与奶牛相遇,那么他就会抓住奶牛。请问至少要多少农民才可以让奶牛无法到达任何一个出口谷仓。
-
一些想法 : 显然, 先钦定 \(k\) 为根, \(dep_k = 0\)。
前置结论 \(0.5\) : 结点 \(u\) 农民最多走到他的 \(dep_u / 2\) 级别祖先 (向下取整)。
我们称一个农民从一个叶子节点比奶牛 先 走到一个节点, 则他 统治 了该结点及其子树。若是一个节点 \(u\) 及其子树被统治了是优美的, 因为这样奶牛就无法到达 \(u\) 及其子树内的任何一个结点 (结论 \(1\))。于是我们可以考虑求出一个农民向爸爸走最远统治的结点 (结论 \(2\)), 并给其打上了标记。然后再做一遍 \(dfs\), 看看奶牛到每一个叶子上会经过多少个 被统治 的结点即可 (结论 \(2\))。
\(Tips\) : 如果经过了被统治的节点后, 就要停止 \(dfs\). -
正确性证明 :
前置结论 \(0.5\) : 无需证明, 画图即可。
结论 \(1\) : 显然, 农夫可以在原地守着不动, 奶牛就进不去 (老六了属于是)。
结论 \(2\) : 我们如果撤掉了一个被统治的结点 \(u\), \(u\) 子树 肯定 要再安放 至少 一个被统治的节点,否则奶牛可以达到 \(u\) 子树内的任意一个叶子, 故选择统治 \(u\) 结点不会更劣, 若是在 \(dfs\) 过程中遇到了 \(u\), 那么也同理。 -
咋做 :
- 我会暴力 !显然我们可以暴力找到 \(dep_u / 2\) 级别祖先, 然后打标记。
- 我会 倍增 / 长剖 转化为 \(k\) 级祖先。由 \(CF208E\) 的特殊 \(Tricks\) 告诉我可以离线 \(dfs\), 然后取栈上 \(k\) 位前的结点。
标签:结论,结点,统治,Cow,dfs,Large,谷仓,奶牛,P4186 来源: https://www.cnblogs.com/Custlo/p/16095065.html