Lonely Mountain Dungeons

这道题目为什么考场上没想出来。。。就是不太相信自己吧,而且有个技巧不太清楚。。哎

很明显的一点是各个种族是分开的,所以我们每个种族单独考虑就好了

假设对于一个种族,我们已经固定了分的组数为\(k\)了,那么肯定是“平均”分到每个组是最好的(这点没办法证明,但是我考场上就是想得这一点啊,要学会相信自己,比较显然吧),按照官方题解的说法,就是

然后就是计算贡献这一点,本来我是想用容斥原理的,但是需要循环,看看官方题解的计算就非常简便,我们要学会(好好想一下整个的时间复杂度)

但是如果\(k>c\)了怎么办?此时,之后的任何一个组数都当前种族的分法都是固定的(让每个人的组别不同),所以贡献也是一样的,此时就要记住官方题解所使用的技巧了,我们用一个数组\(add[i]\)记录下来,最后求出\(add\)数组的前缀和就好了(讨论\(k>c\)的情形对降低时间复杂度非常重要)

update 2024.7.7

其实证明的话,利用反证法+微扰法就可以证明了,也比较easy

然后这一次做我还是没有想到官方题解这种计数方法,主要原因就是计数对象拘泥于每个微观的人,而官方题解是先宏观地将计数对象定为每个组,这种技巧就要记住

当然利用容斥原理卡常也可以做:对第\(i\)类人,当组数\(k\)定后,其对答案的贡献就是$$C_{c_i}^2-(k-c_i\space mod\space k)C_{\lfloor \frac{c_i}{k}\rfloor}^2-(c_i\space mod\space k)C_{\lfloor \frac{c_i}{k}\rfloor+1}^{2} = C_{c_i}^2-kC_{\lfloor \frac{c_i}{k}\rfloor}^2-(c_i\space mod\space k)\lfloor \frac{c_i}{k}\rfloor$$

将所有的\(c\)放入桶中(也就是计数相同\(c\)的个数),然后对于每个\(c\),利用数论分块,在以\(k\)为下标的数组上利用线段树进行维护(数组的值代表对应\(k\),所有\(c\)的贡献),然后计算即可(其实也不用这么麻烦,我们可以像题解一样,对于\(k>c\)的情况单独讨论,于是就可以直接用上面的式子\(O(1)\)计算贡献)

posted @ 2024-02-20 17:18  最爱丁珰  阅读(3)  评论(0编辑  收藏  举报