Codeforces Round #752 (Div. 1) 部分题解

前言

在这里插入图片描述

A

b i b_i bi 表示,有多少个 j ( j ≤ i ) j(j \le i) j(ji) 不后于 i i i 被删除。

那么答案为 NO 当且仅当: 对于每个合法的 b b b,均存在一个 i ∈ [ 1 , n ] i \in [1,n] i[1,n] 使得 ( b i + 1 ) ∣ a i (b_i+1)|a_i (bi+1)ai

不难发现 b b b n ! n! n! 种删数方案构成了双射关系,因此整数序列 b b b 合法当且仅当 ∀ i ∈ [ 1 , n ] \forall i \in [1,n] i[1,n] 满足 1 ≤ b i ≤ i 1 \le b_i \le i 1bii。更进一步的, 2 ≤ b i + 1 ≤ i + 1 2 \le b_i+1 \le i+1 2bi+1i+1

考虑尝试对每个 i ∈ [ 1 , n ] i \in [1,n] i[1,n],钦定一个在 [ 2 , i + 1 ] [2,i+1] [2,i+1] 之间的 B B B 使得 B B B 无法被 a i a_i ai 整除。显然,只要 a i a_i ai 不能被 [ 2 , i + 1 ] [2,i+1] [2,i+1] 中的所有数整除,那么就一定能找到这样的 B B B;从而,答案为 YES 当且仅当,对于每个 i i i 均满足上述条件。

然而我们显然不能每次都 O ( i ) O(i) O(i) 地枚举在 [ 2 , i + 1 ] [2,i+1] [2,i+1] 中的数并进行判定,否则复杂度会退化为 O ( n 2 ) O(n^2) O(n2)。不过注意到, LCM ( 1 , 2 , 3 , ⋯   , 101 ) \text{LCM}(1,2,3,\cdots,101) LCM(1,2,3,,101) 已经远远超过了 1 0 9 10^9 109,因此只要枚举在 [ 2 , min ⁡ ( i + 1 , 100 ) [2,\min(i+1,100) [2,min(i+1,100) 中的数并判断是否整除就足够了。

时间复杂度 O ( 100 n ) O(100n) O(100n),可以通过本题。

B

n < x n<x n<x,则条件等价于 n = y m o d    n n=y \mod n n=ymodn,显然无解。

n > y n>y n>y,则条件等价于 n m o d    x = y n \mod x=y nmodx=y。若 x > y x>y x>y,则令 n = x + y n=x+y n=x+y 即可得到一个答案。

现在只需考虑 x ≤ y x \le y xy 的情况。根据上述推导, n n n 必定满足 x ≤ n ≤ y x \le n \le y xny

那么该如何在此范围内找到某个 n n n 呢?不妨先思考一些比较容易构造的特殊情况——若 3 x > y 3x>y 3x>y,那么只需要令 n = x + y 2 n=\frac {x+y} {2} n=2x+y 就满足了条件;这是因为,此时的 n m o d    x = n − x n \mod x=n-x nmodx=nx y m o d    n = y − n y \mod n=y-n ymodn=yn,当 n n n x , y x,y x,y 的平均数时必然有 n − x = y − n n-x=y-n nx=yn

对于一般情况该怎么办呢?那就转化为上述情况呗!考虑令 x ′ x' x 为不超过 y y y 的最大 x x x 的倍数,因为 n m o d    x ′ = n m o d    x n \mod x'=n \mod x nmodx=nmodx,所以只要满足 n m o d    x ′ = y m o d    n n \mod x'=y \mod n nmodx=ymodn 就满足了条件。注意到此时必然有 3 x ′ > y 3x'>y 3x>y,于是令 n n n x ′ , y x',y x,y 的平均数即可。

单次 O ( 1 ) O(1) O(1),本题被解决。

C

算法一

先思考 O ( n 3 ) O(n^3) O(n3) 的做法。枚举 l , r ( l ≤ r ) l,r(l \le r) l,r(lr)

考虑贪心: 我们从后往前地进行决策,令看了 [ k , r ] ( l < k ≤ r ) [k,r](l < k \le r) [k,r](l<kr) 后,拆分得到的数的最小值为 m m m;那么,我们需要将 a k − 1 a_{k-1} ak1 拆分为若干个不超过 m m m 的数,并在此前提下让拆分得到的数的最小值最大

注意到最多只会拆分出来两种不同的数,所以只需要确定其中较小的那一个就行了。通过简单的数学推导,不难得到较小的数是:

⌊ a k − 1 ⌈ a k − 1 m ⌉ ⌋ \left \lfloor \frac {a_{k-1}} {\left \lceil \frac {a_{k-1}} {m} \right \rceil} \right \rfloor mak1ak1

从后往前扫描,维护当前的最小值,每次将答案加上拆分出来的数的数目减 1 1 1 即可。

若固定 r r r 并枚举 l l l,复杂度被优化为 O ( n 2 ) O(n^2) O(n2)。但无法通过。

算法二

Lemma

m l , r m_{l,r} ml,r 表示,从 r r r 看到 l l l 之后 m m m 的值。

引理给出, m l , l , m l , l + 1 , ⋯   , m l , r m_{l,l},m_{l,l+1},\cdots,m_{l,r} ml,l,ml,l+1,,ml,r 中不同的数的级别为 O ( a l ) O(\sqrt {a_l}) O(al )

Prove

观察这一坨:

⌊ a k − 1 ⌈ a k − 1 m ⌉ ⌋ \left \lfloor \frac {a_{k-1}} {\left \lceil \frac {a_{k-1}} {m} \right \rceil} \right \rfloor mak1ak1

可以发现,在最劣情况下,上式取到的不同值的数目,与 ⌈ a k − 1 1 ⌉ , ⌈ a k − 1 2 ⌉ , ⌈ a k − 1 3 ⌉ ⋯ \lceil \frac {a_{k-1}} {1} \rceil,\lceil \frac {a_{k-1}} {2} \rceil,\lceil \frac {a_{k-1}} {3} \rceil \cdots 1ak1,2ak1,3ak1 取到的不同值的数目相等。

而后者的级别是 O ( a i ) O(\sqrt {a_i}) O(ai ) 个,因此前者的级别也是 O ( a i ) O(\sqrt {a_i}) O(ai )


考虑用一个 vector 维护所有可能被取到的 f l , ⋅ f_{l,\large{\cdot}} fl, 以及对应的 r r r,那么每次就可以 O ( a i ) O(\sqrt {a_i}) O(ai ) 地计算了。

不妨设 a i a_i ai n n n 同级,则总复杂度 O ( n n ) O(n \sqrt n) O(nn ),本题被解决。

D

这可能是我入坑以来见到过的最好的题吧。果然还是我粗陋寡闻了。

算法一

考虑 dp \text{dp} dp

f i , j f_{i,j} fi,j 表示,目前填了 i i i 位,最后一位填了 j j j
g l , r g_{l,r} gl,r 表示,有多少对 l ≤ i ≤ j ≤ r l \le i \le j \le r lijr 满足 gcd ⁡ ( i , j ) ≥ l \gcd(i,j) \ge l gcd(i,j)l

f f f 的转移如下:

f i , j = min ⁡ k = 1 j − 1 { f i − 1 , k + g k + 1 , j } f_{i,j}=\min_{k=1}^{j-1} \{f_{i-1,k}+g_{k+1,j}\} fi,j=k=1minj1{fi1,k+gk+1,j}

现在关键在于如何求出 g g g

考虑枚举 i , j ( i ≤ j ) i,j(i \le j) i,j(ij) 并计算出其贡献。首先,我们求出 gcd ⁡ ( i , j ) = x \gcd(i,j)=x gcd(i,j)=x,则对于任意满足 l ≤ x l \le x lx r ≥ j r \ge j rj g l , r g_{l,r} gl,r 都要增大 1 1 1。不难发现这可以通过二维前缀和搞定。

总复杂度 O ( n 2 k + q ) O(n^2k+q) O(n2k+q),完全无法接受。

算法二

为方便叙述,我们钦定 g l , r g_{l,r} gl,r 为满足 l ≤ i < j ≤ r l \le i<j \le r li<jr(注意是小于而不是小于等于)且 gcd ⁡ ( i , j ) ≥ l \gcd(i,j) \ge l gcd(i,j)l ( i , j ) (i,j) (i,j) 对数。

如果打出 g g g,你会惊人地发现: 对于任意满足 r < 2 l r<2l r<2l ( l , r ) (l,r) (l,r),均有 g l , r = 0 g_{l,r}=0 gl,r=0

因此,若 k > log ⁡ 2 n k>\log_2 n k>log2n,则答案为 0 0 0

从而, f f f 的第二维只需要枚举到 log ⁡ n \log_n logn 就足够啦!

总复杂度 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn),依然无法通过。

算法三

n n n 达到了 3 × 1 0 5 3 \times 10^5 3×105 级别后,预处理出所有的 g g g 明显已无法接受了。所以,我们不得不在转移的过程中,快速求出 g g g 值。

为方便,令 g l , r ′ = ∑ i = l r ∑ j = l r [ gcd ⁡ ( i , j ) ≥ l ] g'_{l,r}=\sum_{i=l}^r \sum_{j=l}^r [\gcd(i,j) \ge l] gl,r=i=lrj=lr[gcd(i,j)l],则显然有 g l , r = g ′ ( l , r ) + ( r − l + 1 ) 2 g_{l,r}=\frac {g'(l,r)+(r-l+1)} {2} gl,r=2g(l,r)+(rl+1)

考虑使对 g ′ g' g 进行推导:

g l , r ′ = ∑ i = 1 r ∑ j = 1 r [ gcd ⁡ ( i , j ) ≥ l ] = ∑ k = l r ∑ i = 1 r ∑ j = 1 r [ gcd ⁡ ( i , j ) = k ] = ∑ k = l r ∑ i = 1 ⌊ r k ⌋ ∑ j = 1 ⌊ r k ⌋ [ gcd ⁡ ( i , j ) = 1 ] = ∑ k = l r w ⌊ r k ⌋ \begin{aligned} g'_{l,r} &=\sum_{i=1}^r \sum_{j=1}^r [\gcd(i,j) \ge l] \\ &= \sum_{k=l}^r \sum_{i=1}^r \sum_{j=1}^r [\gcd(i,j)=k] \\ &= \sum_{k=l}^r \sum_{i=1}^{\lfloor \frac r k \rfloor} \sum_{j=1}^{\lfloor \frac {r} {k} \rfloor} [\gcd(i,j)=1] \\ &=\sum_{k=l}^r w_{\lfloor \frac r k \rfloor} \end{aligned} gl,r=i=1rj=1r[gcd(i,j)l]=k=lri=1rj=1r[gcd(i,j)=k]=k=lri=1krj=1kr[gcd(i,j)=1]=k=lrwkr

其中:

w x = ∑ i = 1 x ∑ j = 1 x [ gcd ⁡ ( i , j ) = 1 ] = ∑ i = 1 x φ ( x ) = w x − 1 + φ ( x ) \begin{aligned} w_x &= \sum_{i=1}^x \sum_{j=1}^x [\gcd(i,j)=1] \\ &= \sum_{i=1}^x \varphi(x) \\ &=w_{x-1}+\varphi(x) \end{aligned} wx=i=1xj=1x[gcd(i,j)=1]=i=1xφ(x)=wx1+φ(x)

通过线性筛+递归 O ( n ) O(n) O(n) 预处理出 w w w,那么每次就可以整除分快 O ( n ) O(\sqrt n) O(n ) 地计算 g g g 了。

总复杂度 O ( n 2 log ⁡ n n ) O(n^2 \log n \sqrt n) O(n2lognn ),虽然劣于算法二,但是其潜力十足。

算法四

Lemma

f f f 具有决策单调性


采用分治优化决策单调性 dp \text{dp} dp,总复杂度 O ( n log ⁡ 2 n n ) O(n \log^2 n \sqrt n) O(nlog2nn ),其依旧需要优化。

算法五

现在,关键在于把 n \sqrt n n 从复杂度从去掉。

在分治过程中,令当前想要求出 f ⋅ , r f_{{\large{\cdot}},r} f,r 的值。我们可以从大到小枚举 l l l,并实时维护 ∑ k = l r w ⌊ r k ⌋ \sum_{k=l}^r w_{\lfloor \frac r k \rfloor} k=lrwkr,每次 O ( 1 ) O(1) O(1) 更新即可。

但是,如果你仔细思考,发现事情并没有这么简单: 若当前的分治区间为 [ l , r ] [l,r] [l,r] 且中点为 m i d mid mid,决策区间为 [ L , R ] [L,R] [L,R],若 R < m i d R<mid R<mid 那么需要计算 ∑ i = R + 1 m i d w ⌊ m i d i ⌋ \sum_{i=R+1}^{mid} w_{\lfloor \frac {mid} i \rfloor} i=R+1midwimid,否则无法保证后续的正确性。一种非常 naive 的想法是,直接从 min ⁡ ( m i d , R ) \min(mid,R) min(mid,R) 开始往下枚举维护,虽然拥有正确性,但是在特殊构造的数据下会退化成 O ( n 2 log ⁡ 2 n ) O(n^2 \log^2 n) O(n2log2n)。因此,我们须套用算法四中的整除分块来计算这一部分,虽然单次 O ( n ) O(\sqrt n) O(n ),但一共只会计算 O ( n log ⁡ n ) O(n \log n) O(nlogn) 次,所以不是很 shameful。

总复杂度 O ( n log ⁡ 2 n + n n log ⁡ n ) O(n \log^2 n+n \sqrt n \log n) O(nlog2n+nn logn),看起来还不是很能接受的亚子。但题解中说它是 O ( n log ⁡ 2 n + n n ) O(n \log^2 n+n \sqrt n) O(nlog2n+nn ) 的,不过我也不太会证,反正能过就是了,因此就搁这不管了。

E,F

咕咕咕

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值