Codeforces Round #752 (Div. 1) (CF1603)

A

Description

给定一个长度为\(n\)的序列\(\{ a_i\}\),进行\(n\)次删除操作:如果对于当前序列第\(i\)个数对\((i+1)\)取模不等于\(0\),则可以将第\(i\)个数删掉。给定序列,问是否可以通过这样的操作将所有元素全部删掉。

Solution

结论:对于每一个\(a_i\),只要存在一个不大于\((i+1)\)的数,使得\(a_i\)取模该数不等于\(0\),那么序列就可以被完全删除。

证明:我们设\(b_i\)表示\(a_i\)被删掉的时候在序列中的位置,则对于满足\(a_i \bmod (b_i+1) \neq 0\)\(b_i\le i\)的所有\(\{b_i\}\)都是合法的,我们需要证明对于任意一种合法的\(\{b_i\}\),都存在一种删除方案。我们每次可以选择最靠右的、满足\(b_i=i\)的位置,将其删去。因为最开始有\(b_i\le i\),第\(i\)个位置的数需要在前面删掉\((i-1)\)个数才能顶到首位,所以不管何种状况下都有\(b_1=1\),也就是我们一定能找到一个\(b_i=i\)的位置。如此删\(n\)次即可。

B

Description

给定两个偶数\(x,y\),要求构造\(n\)使得\(n\bmod x = y \bmod n\)

\(x,y\le 10^9,n\le 2\cdot 10^{18}\)

Solution

对于\(x=y\)\(n=x\)

对于\(x>y\)\(n=(x+1)y\),此时\(n\bmod x = y\bmod n = y\)

对于\(x<y\)

  • \(y-x<2x\)\(n=(x+y)/2\),此时\(n\bmod x = n-x, y\bmod n = y - n, n-x=y-n\)

  • \(y-x\ge 2x\):容易发现\(n\le x\)\(n\ge y\)都是不可能的,所以考虑在中间寻找答案。

    假设\(n\ge (x+y)/2\)

    \(y \bmod n=y-n\),可以画出其函数图像,为一次函数。

    \(n \bmod x=(n-x)\bmod x\),发现函数图像呈锯齿状。

    求两个图像的交点即可。(由于\(x,y\)为偶数,所以交点坐标一定是整数)

C

Description

有一种操作,每次可以将序列中的某个数拆成和为该数的两个数。

一个序列的extreme value定义为将该序列用此操作变成不降序列的最少操作次数。

给定一个序列,求其每个子串的extreme value的和对\(998244353\)取模的结果。

Solution

从右往左拆每个数,当前拆出来的数应该小于等于右边的数,由此判断至少应该拆分成几个数,得到数字个数后,我们想尽可能拆得平均,即两两之差不超过1。然后考虑左边的数……

对于每个子串,它们的开头是不需要拆的,所以不同的子串会有很多不同的情况。

但是我们发现,对于一个数的平均拆分,得到的数的种类是\(O(\sqrt{n})\)的。所以对于每个位置将每一种划分结果的最左边的数的贡献都存下来,计算答案即可。

直接做的空间复杂度为\(O(n\sqrt n\),由于空间卡不满可以AC,不过也可以通过滚动数组优化到\(O(n)\)

D

Description

定义\(c(l,r)\)表示满足\(l\le i \le j \le r\)\(\gcd(i,j)\ge l\)的数对\((i,j)\)的数量。

给定\(n,k\)\(1\le k \le n\)),定义\(f(n,k)\)表示对于任意满足\(0=x_1<x_2<\dots<x_k<x_{k+1}=n\)\(\{x_i\}\)\(\sum_{i=1}^k c(x_i + 1, x_{i + 1})\)的最小值。

给定\(3\cdot 10^5\)\(n,k\)\(1\le k \le n \le 10^5\),求\(f(n,k)\)

Solution

一个需要考虑的问题是如何快速计算\(c(l,r)\)

\[\begin{aligned} c(l,r) &= (r-l+1)+\sum_{i=l}^r \sum_{j=i+1}^r [\gcd(i,j) \ge l] \\ &= (r-l+1)+\sum_{k=l}^r \sum_{i=1}^{\lfloor r/k\rfloor} \sum_{j=i+1}^{\lfloor r / k \rfloor} [\gcd(i,j) = 1] \\ &= (r-l+1)+\sum_{k=l}^r \sum_{i=1}^{\lfloor r/k\rfloor}\varphi (i) \\ &= (r-l+1)+\sum_{k=l}^r s(\lfloor r / k \rfloor) \end{aligned} \]

其中\(s(x)\)\(\varphi(x)\)的前缀和,可以\(O(n)\)预处理得到。对于\(c(l,r)\),可以通过整除分块\(O(\sqrt{n})\)计算。

一个结论是\(k>\log_2 n\)\(f(n,k)=n\)

证明:构造:\([1,1], [2,3], [4,7], \dots , [2^{L-1},2^L-1],[2^L,n]\),每一个区间的贡献即区间长度。如果在这个基础上进一步分段,仍然有区间贡献为区间长度。

有了这个结论,我们不仅可以只需要在小范围内枚举段数,而且可以将所有\(f(n,k)\)求出后再回答询问(这也意味着我们只能从前往后DP)。

那么我们设\(f_{i,j}\)表示前\(i\)个数分了\(j\)段的最小值,容易得到一个\(O(n^2\log n)\)的做法。

发现性质\(c(i,k)+c(j,l) \le c(i,l)+c(j,k)\)(证明显然),利用决策单调性来优化这个DP。考虑分治,区间\([L,R]\)的决策点在\([l,r]\)中,暴力检查\(MID\)的转移点在\([l,r]\)中的哪个位置,递归处理即可。

\(\log_2n\)次分治的时间复杂度是\(O(n \log ^2 n)\)的,而对于\(c(i,j)\)的计算,我们对于每一次分治都只需要用\(O(\sqrt n\)求出一个区间的\(c(i,j)\)、剩下的可以依次推得,故时间复杂度加上\(O(n\sqrt{n} \log n)\)

posted @ 2022-03-13 16:23  Hany01  阅读(25)  评论(0编辑  收藏  举报