CF1098E Fedya the Potter
题意:有一个序列(A)。
对所有(1leq lleq rleq |A|),将(gcd_{i=l}^{r}A_i)加入(B)中。
然后将(B)从小到大排序。
对所有(1leq lleq rleq |B|),将(sum_{i=l}^{r}B_i)加入(C)中。
求(C)的中位数,即(C_{lfloorfrac{|C|}{2} floor})。
(nleq 50000,A_ileq 100000)。
求中位数见得多了就可以知道要先二分答案,然后求(C)中(leq M)的数的数量。
先找一下(B)的性质。由(gcd)的一套理论可以知道(B)中不会超过(nlog V)个不同的数(当然这个题有值域的限制,这个就没用了)
现在要求(B)中和(leq M)的段数。如果(B)长度短可以双指针求,但是(B)长度是(O(n^2))的。
然而因为(B)中不同元素不多,还是可以双指针
双指针时细节什么的可以看代码,总之现在问题变成了:
左边有(sa)个数(a),右边有(sb)个数(b),中间数和为(S)。
你要选一个子段,还是要满足和(leq M),而且(a)和(b)都至少要选到一个。
列出一个naive的式子:
(sum_{i=1}^{sa}sum_{j=1}^{sb}[ai+bj+Sleq M])
稍作变换:
(sum_{i=1}^{sa}sum_{j=1}^{sb}[jleqfrac{M-S-ai}{b}])
(sum_{i=1}^{sa}min(sb,max(0,lfloorfrac{M-S-ai}{b} floor)))
(sum_{i=1}^{sa}max(0,lfloorfrac{M-S-ai}{b} floor)-sum_{i=1}^{sa}max(0,lfloorfrac{M-S-ai-sb}{b} floor))
那么问题又变成了,求
(sum_{i=0}^nmax(0,lfloorfrac{ai+b}{c} floor))
(注意因为类欧是从(0)开始的这里也是(0)开始)
这就是一个典型的类欧了。设(F(n,a,b,c)=sum_{i=0}^nmax(0,lfloorfrac{ai+b}{c} floor))。
求法就是一个大讨论:
首先考虑将(a,b)转成正数。
- 如果(a<0),(F(n,a,b,c)=F(n,-a,b+na,c))
- 如果(b<0),因为有(a>0)了,可以知道(ileq d=lceilfrac{-b}{a} ceil)时都会有(lfloorfrac{ai+b}{c} floor<0)。消掉前面这部分,(F(n,a,b,c)=F(n-d,a,b+ad,c))
(a,b)转正之后(max)操作没有用了,问题变成(sum_{i=0}^nlfloorfrac{ai+b}{c} floor)
如果(ageq c)或(bgeq c),设(a'=lfloorfrac ac floor,b'=lfloorfrac bc floor,a_0=amod c,b_0=bmod c)。
(sum_{i=0}^nlfloorfrac{ai+b}{c} floor=sum_{i=0}^nlfloorfrac{(a'c+a_0)i+b'c+b_0}{c} floor)
(=sum_{i=0}^nlfloorfrac{a_0i+b_0}{c} floor+sum_{i=0}^na'i+b'(n+1))
(=F(n,a_0,b_0,c)+a'C_{n+1}^2+b'(n+1))
否则考虑一个平面上的直线(f(x)=lfloorfrac ac floor x+lfloorfrac bc floor)。那么求的是满足(xin [0,n],y>0)而且在这条直线下方的整点数。
这些整点最大的(y)显然是(m=lfloorfrac{an+b}{c} floor)
考虑拆了式子,(F(n,a,b,c)=sum_{i=0}^nlfloorfrac{ai+b}{c} floor)
(=sum_{i=0}^nsum_{j=1}^m[jleq frac{ai+b}{c}])
因为(b<c)所以(i=0)没有用,稍作变换:
(=sum_{i=1}^nsum_{j=1}^m[cjleq ai+b])
(=sum_{i=1}^nsum_{j=1}^m[aigeq cj-b])
(=sum_{j=0}^{m-1}sum_{i=1}^n[aigeq cj-b+c])
(=sum_{j=0}^{m-1}sum_{i=1}^n[ai> cj-b+c-1])
(=sum_{j=0}^{m-1}n-sum_{i=1}^n[aileq cj-b+c-1])
(=nm-sum_{j=0}^{m-1}sum_{i=1}^n[ileq frac{cj-b+c-1}{a}])
(=nm-sum_{j=0}^{m-1}lfloorfrac{cj-b+c-1}{a} floor)
(=nm-F(m-1,c,c-b-1,a))
类似辗转相除法,这个过程是(O(log n))的。