ZROI 19.08.10模拟赛

Posted suwakow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZROI 19.08.10模拟赛相关的知识,希望对你有一定的参考价值。

传送门

写在前面:为了保护正睿题目版权,这里不放题面,只写题解。


  • A

\(20pts:\)

枚举操作序列然后暴力跑,复杂度\(O(6^n)\)

\([50,80]pts:\)

枚举改成dfs,每层操作后还原。复杂度\(O(3^n)\)

全0或全1可以直接返回。

写法优秀可以过\(80pts\)

\(100pts:\)

类似非递归fft的写法,bitrev后可以位运算优化。

最下面四层可以预处理,复杂度\(O(3^n-4)\)

然后疯狂卡常就完事了(

然而由于swk人菜常数大,明明所有剪枝都加上了仍然挂掉了qwq

破案了,原来swk太菜了,在递归的每一层都重构了一遍结构体,结构体里还用了vector,于是多了\(12\)倍常数,就死掉了。


  • B

\(80pts:\)

枚举最小差,设为\(d\)

统计最小差大于等于 \(d\) 的集合最大差之和,发现对于一个最小差为\(x\)的集合,它的最大差刚好被统计了\(x\)次。

直接dp,设\(f_i\)表示前\(i\)个元素,且第\(i\)个元素必选的最大差之和。转移时需要一堆前缀和。我代码写的特别诡异

\(100pts:\)

仍然枚举\(d\),对每个\(d\)枚举集合元素个数\(x\),发现\(dx\leq n\),所以枚举复杂度为\(O(n\log n)\)

然后随便组合数一下就可以了。

发现集合中的最大值和最小值是对称的,可以分开算。

考虑枚举最小值为\(c\),则方案数为\((^n-c-x(d-1)_~~~~~~~~x-1)\)。即选中\(x\)个元素,在它们后面附带\(d-1\)个额外的空格,其中位于位置\(c\)的元素必须被选中,且前面不能有任何被选中的元素,可以直接把这个元素删掉。

\(a=n-x(d-1),b=x-1\),则总贡献为\(\sum_c=1^a-b c\cdot (^a-c_~~~b)=\sum_c=b^a (a-c)\cdot (^c_b)=\sum_c=b^a (a+1)\cdot(^c_b)-(c+1)\cdot (^c_b)\)

将后半部分拆开,得到\((c+1)\cdot (^c_b)=\frac(c+1)c!b!(c-b)!=(b+1)\frac(c+1)!(b+1)!(c-b)!=(b+1)\cdot(^c+1_b+1)\)

代回上式,得到\(\sum_c=b^a (a+1)\cdot(^c_b)-(b+1)\cdot (^c+1_b+1)=(a+1)\cdot(^c+1_b+1)-(b+1)\cdot(^c+2_b+2)\)。可以\(O(1)\)计算。


  • C

swk完全不会做找观察题所以光荣爆零了。然而大家都切了这道题,所以swk菜死了。

一个很重要的结论就是每个点只会往上走。

感性理解下就是越往上边就越稀疏。

于是每个点只有\(O(\log)\)个点与它相关,建出边直接跑就可以了。

上面的写法比较麻烦。好写一点的方法是,两个点必然在lca附近相遇。对每个点可以算出向上不经过桥最近的祖先,贪心地找最高的祖先即可。需要特判两个点在祖先的两侧相遇的情况。

以上是关于ZROI 19.08.10模拟赛的主要内容,如果未能解决你的问题,请参考以下文章

ZROI提高组模拟赛05总结

ZROI 19.08.11模拟赛

ZROI 19.08.07模拟赛

ZROI 19.08.12模拟赛

ZROI 19.08.09模拟赛

ZROI 19.08.05模拟赛