🍕🏠🌋 当前时间是:

 

意念力

题目链接

很有道理的题。


把划分集合的方案容斥一下,变成染色的方案。

再从边界情况考虑问题。

设当前钦定有 \(x\) 种颜色。

从前往后考虑每个点的贡献。

容易发现,它与在它之前的 k-邻域内任意一点颜色不同即可满足条件。

而它之前 k-邻域内的任意两点颜色也是不同的。

所以它对答案的贡献就是 \((x-p)\),其中 \(p\) 是它之前 k-邻域内的点数。

所以容斥后的答案就是关于 \(x\)\(O(n)\) 个一次多项式乘起来。

分治 NTT 和多项式多点求值就可以 \(O(n\log^2 n)\) 解决。

菊花

仿照链的思路,把贡献拆到点上,并找到每个点要和多少个其他点颜色不同。

按照到根的边权从小到大排序,增量地增加点,那么要求它与之前的一个前缀内的点颜色不同,而这个前缀内的点两两也是不同的。

求答案的方法可以仿照链。

一般情况

如果对于一个点 \(u\) 的儿子,依然按照到 \(u\) 的边权排序求贡献,会出现下面的问题:

\(dis_{a,p}\leq k\)\(dis_{b,p}\leq k\),但 \(dis_{a,b}>k\)

此时 \(a,b\) 的颜色可能相同。

所以要找另一种增量顺序规避这种情况。

注意到按照到根节点的距离增量即可。

至此就得到了每个点的贡献 \((x-p)\)。计数的部分依然是仿照链。

而对于每个点求 \(p\),可以点分治,变成二维数点。

总的时间复杂度就是 \(O(n\log^2 n)\) 的。

https://qoj.ac/submission/820388

多点求值似乎有些太困难了。由于只需要求 \(1\)\(n\) 的点值,可以用下降幂多项式。

posted @ 2024-12-21 16:25  zzafanti  阅读(20)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end