• CF1098E Fedya the Potter


    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)转成正数。

    1. 如果(a<0)(F(n,a,b,c)=F(n,-a,b+na,c))
    2. 如果(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))的。

    https://codeforces.com/contest/1098/submission/56515109

  • 相关阅读:
    bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形【叉积+极角排序+瞎搞】
    poj 1286 Necklace of Beads【polya定理+burnside引理】
    poj 2154 Color【polya定理+欧拉函数】
    poj 2409 Let it Bead【polya定理+burnside引理】
    bzoj 3534: [Sdoi2014]重建【矩阵树定理】
    bzoj 1774: [Usaco2009 Dec]Toll 过路费【排序+Floyd】
    bzoj 4596: [Shoi2016]黑暗前的幻想乡【容斥原理+矩阵树定理】
    bzoj 4031: [HEOI2015]小Z的房间【矩阵树定理】
    poj Find a multiple【鸽巢原理】
    bzoj Strange Way to Express Integers【excrt】
  • 原文地址:https://www.cnblogs.com/xzz_233/p/11158068.html
Copyright © 2020-2023  润新知