【省选模拟】20/02/14

  • n1e12,T1e6,1sn\le 1e12, T\le 1e6,1s
  • 设二者答案为 fi,gif_i,g_i,对于 fif_i 我们的策略是先把 i1i-1 个移动到第 3 个,再把当前移动一步,再把那 i1i-1 个移两步,那么就有 fi=2gi+1f_i=2*g_i+1
    对于 gig_i 我们的策略是先把 i1i-1 移动到第 3 个,再把当前移动一步,再把 i1i-1 向后移一步,把当前移一步,最后把 i1i-1 移两步,那么有 gi=gi1+1+fi1+1+gi1g_i=g_{i-1}+1+f_{i-1}+1+g_{i-1}
    可以矩阵乘法,但直接矩阵乘会超时,于是考虑 bsgsbsgsxn=(xB)nBxn%Bx^n=(x^B)^{\lfloor \frac{n}{B} \rfloor}*x^{n\%B},预处理过后就可以快速计算,算 (AB)v(A*B)*v 的时候按 A(Bv)A*(B*v) 只需要 18 次乘法,而原本需要 36 次
    CodeCode

【省选模拟】20/02/14

  • n,m5000n,m\le 5000
  • 就是把 nn 个数填到 gcd(k,n)gcd(k,n) 个环中,最大化相邻边的乘积,可以贪心将次大和次次大填到最大的两边,然后向两头扩展,复杂度可以做到 O(nσ0(n))O(n\sigma_0(n))CodeCode

【省选模拟】20/02/14

  • n1e5n\le 1e5
  • 考场觉得细节有点多就只打了 7070 分暴力,暴力的话求一个区间的答案可以暴力枚举每一个区间对它的贡献,分 l,rl,r 的范围讨论,正解也不难想,考虑一个区间 ii 对所有区间 jj 的贡献就可以,大概分类下面几类:
    rjlir_j\le l_i,有 1 的贡献
    lilj,rjril_i\le l_j,r_j\le r_i,有 rirjleni+0.5lenjleni\frac{r_i-r_j}{len_i}+\frac{0.5*len_j}{len_i} 的贡献
    ljli,rirjl_j\le l_i,r_i\le r_j,有 liljlenj+0.5lenilenj\frac{l_i-l_j}{len_j}+\frac{0.5*len_i}{len_j} 的贡献,但是会把 li=lj,ri=rjl_i=l_j,r_i=r_j 的算重,减掉即可
    li<lj<ri,ri<rjl_i<l_j<r_i,r_i<r_j,有 0.5(rilj)2lenilenj0.5*\frac{(r_i-l_j)^2}{len_ilen_j} 的贡献
    li>lj,li<rj<ril_i>l_j,l_i<r_j<r_i,有 10.5(rjli)2lenilenj1-0.5*\frac{(r_j-l_i)^2}{len_ilen_j} 的贡献
    所以我们需要维护 rj,1lenj,lenj,ljlenj,rjlenj,lj2lenj,rj2lenjr_j,\frac{1}{len_j},len_j,\frac{l_j}{len_j},\frac{r_j}{len_j},\frac{l_j^2}{len_j},\frac{r_j^2}{len_j} 及常数项的系数,那么就是矩阵加单点求值,常数过大写了个 bitbit 拯救一下,复杂度 O(nlog(n))O(nlog(n))
    CodeCode

相关文章:

  • 2021-07-18
  • 2021-10-26
  • 2021-12-13
  • 2021-11-21
  • 2021-06-11
  • 2021-12-22
  • 2021-11-30
猜你喜欢
  • 2022-03-03
  • 2022-03-03
  • 2021-09-01
  • 2021-06-29
  • 2022-01-21
  • 2021-11-28
  • 2021-12-04
相关资源
相似解决方案