Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学
传送门
文章目录
- 题意:
- 思路:
题意:
给你一个数组aia_iai,定义一个数组是好的当且仅当对于所有iii都有ai!=ia_i!=iai!=i。定义f(a)f(a)f(a)表示数组aaa中i<j,ai+aj=i+ji<j,a_i+a_j=i+ji<j,ai+aj=i+j的(i,j)(i,j)(i,j)对数。定义一个数组是极好的包含以下三个条件:
(1)a(1)a(1)a数组是好的。
(2)l≤ai≤r(2)l\le a_i\le r(2)l≤ai≤r
(3)f(a)(3)f(a)(3)f(a)在所有的好的数组中是最大的。
给定l,rl,rl,r,让你求出来有多少个极好的数组。
n≤2e5,−109≤l≤1,n≤r≤109n\le2e5,-10^9\le l\le1,n\le r\le 10^9n≤2e5,−109≤l≤1,n≤r≤109
思路:
首先考虑f(a)f(a)f(a)最大的时候是什么情况,如果没有ai!=ia_i!=iai!=i的条件,肯定是ai=ia_i=iai=i的时候最大。现在有这个条件,那么我们可以将其加上一个偏移量kkk,即ai+k,ai−ka_i+k,a_i-kai+k,ai−k,考虑长度nnn的数组,一定是一半ai+ka_i+kai+k,另一半ai−ka_i-kai−k,这样f(a)=⌈n2⌉∗⌊n2⌋f(a)=\left \lceil \frac{n}{2} \right \rceil * \left \lfloor \frac{n}{2} \right \rfloorf(a)=⌈2n⌉∗⌊2n⌋,此时一定是最大的。
通过以上分析,我们知道每个位置一定是加上或减去一个偏移量kkk构造出来的数组才有可能是极好的数组,由于aia_iai的范围有限制,我们分以下几种情况讨论:
(1)k≤min(1−l,r−n)(1)k\le min(1-l,r-n)(1)k≤min(1−l,r−n)
此时对于每个位置ai+k,ai−ka_i+k,a_i-kai+k,ai−k两个数都不会超过范围,所以当nnn为偶数的时候,可以选择n/2n/2n/2个位置+k+k+k,贡献就是C(n,n/2)C(n,n/2)C(n,n/2),是奇数的时候,可以选择n/2n/2n/2个位置+k+k+k或者n/2+1n/2+1n/2+1个位置+k+k+k。
(2)k>min(1−l,r−n)(2)k>min(1-l,r-n)(2)k>min(1−l,r−n)
我们设k=min(1−l,r−n)+1k=min(1-l,r-n)+1k=min(1−l,r−n)+1,那么有max(1,l+k)−1max(1,l+k)-1max(1,l+k)−1个人必须+k+k+k,有n−min(n,r−k)n-min(n,r-k)n−min(n,r−k)个人必须−k-k−k,否则他们就越界了。设减去上述两个剩下的位置是restrestrest,那么问题转换成跟第一种情况一样了,只是从nnn变成了restrestrest。
注意第二种情况我们不需要特判,只需要在求C(n,m)C(n,m)C(n,m)的时候判断一下n,m<0,n<mn,m<0,n<mn,m<0,n<m的情况直接返回000即可。
第二种情况最多迭代nnn次,复杂度O(n)O(n)O(n)。
总结
以上是生活随笔为你收集整理的Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Origin怎么把两张图合成一张 Ori
- 下一篇: AtCoder Regular Cont