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

本文探讨了五个算法难题的高效解决方案,包括双射关系下的整数序列判定、整除条件的特殊构造、数列拆分问题的优化策略、复杂度优化的动态规划和大数据范围内的快速计算。每个部分都展示了从复杂到优化的过程和关键技巧。

前言

在这里插入图片描述

A

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

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

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

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

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

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

B

n<xn<xn<x,则条件等价于 n=ymod  nn=y \mod nn=ymodn,显然无解。

n>yn>yn>y,则条件等价于 nmod  x=yn \mod x=ynmodx=y。若 x>yx>yx>y,则令 n=x+yn=x+yn=x+y 即可得到一个答案。

现在只需考虑 x≤yx \le yxy 的情况。根据上述推导,nnn 必定满足 x≤n≤yx \le n \le yxny

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

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

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

C

算法一

先思考 O(n3)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) 后,拆分得到的数的最小值为 mmm;那么,我们需要将 ak−1a_{k-1}ak1 拆分为若干个不超过 mmm 的数,并在此前提下让拆分得到的数的最小值最大

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

⌊ak−1⌈ak−1m⌉⌋\left \lfloor \frac {a_{k-1}} {\left \lceil \frac {a_{k-1}} {m} \right \rceil} \right \rfloormak1ak1

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

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

算法二

Lemma

ml,rm_{l,r}ml,r 表示,从 rrr 看到 lll 之后 mmm 的值。

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

Prove

观察这一坨:

⌊ak−1⌈ak−1m⌉⌋\left \lfloor \frac {a_{k-1}} {\left \lceil \frac {a_{k-1}} {m} \right \rceil} \right \rfloormak1ak1

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

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


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

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

D

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

算法一

考虑 dp\text{dp}dp

fi,jf_{i,j}fi,j 表示,目前填了 iii 位,最后一位填了 jjj
gl,rg_{l,r}gl,r 表示,有多少对 l≤i≤j≤rl \le i \le j \le rlijr 满足 gcd⁡(i,j)≥l\gcd(i,j) \ge lgcd(i,j)l

fff 的转移如下:

fi,j=min⁡k=1j−1{fi−1,k+gk+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}

现在关键在于如何求出 ggg

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

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

算法二

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

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

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

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

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

算法三

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

为方便,令 gl,r′=∑i=lr∑j=lr[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],则显然有 gl,r=g′(l,r)+(r−l+1)2g_{l,r}=\frac {g'(l,r)+(r-l+1)} {2}gl,r=2g(l,r)+(rl+1)

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

gl,r′=∑i=1r∑j=1r[gcd⁡(i,j)≥l]=∑k=lr∑i=1r∑j=1r[gcd⁡(i,j)=k]=∑k=lr∑i=1⌊rk⌋∑j=1⌊rk⌋[gcd⁡(i,j)=1]=∑k=lrw⌊rk⌋\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

其中:

wx=∑i=1x∑j=1x[gcd⁡(i,j)=1]=∑i=1xφ(x)=wx−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) 预处理出 www,那么每次就可以整除分快 O(n)O(\sqrt n)O(n) 地计算 ggg 了。

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

算法四

Lemma

fff 具有决策单调性


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

算法五

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

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

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

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

E,F

咕咕咕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值