Codeforces Round 775 A ~ D 题解
A. Weird Sum
题意
给定一个 $m \times n$ 的矩阵,求任意一对值相同的元素的曼哈顿距离和。
$m \times n \leq 10^5$
解法
枚举值,取出所有这个值的元素,用 vector 记录即可。$x$ 从小到大扫描,依次加入元素,用树状数组维护当前元素和前面所有的和。具体的,树状数组以 $y$ 为下标,分别记录元素个数、$y$ 坐标加 $x$ 坐标、$y$ 坐标减 $x$ 坐标,分别计算 $y$ 坐标比当前元素小的和大的贡献。
code
code
1 |
|
B. Integral Array
题意
给定一个数组 $a$,求是否对于任意 $a$ 中的两个元素 $x,y,x \geq y$,$\lfloor \frac{x}{y} \rfloor$ 都出现在数组中。
$n \leq 10^6,1 \leq a_i \leq 10^6$
解法
考虑枚举没有出现在数组中的数 $z$,如果数组中存在 $x,y,x \geq y$ 满足 $\lfloor \frac{x}{y} \rfloor = z$,这个数组就不不合法。考虑枚举 $y$,判断是否存在 $x \in [yz,(y+1)z-1]$ 即可。由于 $1 \leq y \leq \lfloor \frac{x}{z} \rfloor$,所以 $y$ 的总个数是调和级数。
code
code
1 |
|
C. Tyler and Strings
题意
给定两个字符串 $s$ 和 $t$,求重排 $s$ 后有多少种情况 $s$ 的字典序小于 $t$。
$|s|,|t| \leq 2 \times 10^5$,字符集 $2 \times 10^5$。
解法
枚举 $s$ 第一个比 $t$ 小的地方 $i$,$[1,i-1]$ 的部分 $s$ 和 $t$ 一定相同,如果无法满足情况数为 $0$,下面讨论的情况已钦定此条件满足。如果能够只需要满足 $s_i < t_i$,后面任意。假如我们钦定了 $i$ 选什么,后面的总情况就是 $w=(\sum a_j)! \prod (a_j!)^{-1}$,$a_i$ 为字符 $i$ 剩下的个数。考虑上 $s_i$,选定 $s_i$ 的影响就是 $a_{s_i}$ 减 $1$,总情况变为 $w=((\sum a_j)-1)! \prod ((a_j-[j=s_i])!)^{-1}$,可以发现对于不同的 $s_i$,变化的项只有 $1$ 个,我们令 $w’=((\sum a_j)-1)! \prod (a_j!)^{-1}$,选定 $s_i$ 的贡献即为 $w=w’\times (a_j!) \times ((a_j-1)!)^{-1}$,我们只需要统计后面这一块的和 $t$ 即可,用树状数组维护。
$i$ 每向后移动一位,$a_{s_{i-1}}$ 都会减少 $1$,$w$ 和 $t$ 也会相应改变,但是每次只改变一项,直接维护即可。
code
code
1 |
|
D. Serious Business
题意
给定一个 $3 \times n$ 的矩阵,每个位置有一个值。第一行和第三行可以走,第二行不可以。共有 $q$ 个操作,第 $i$ 个操作可以用 $k_i$ 的代价把第二行 $[l_i,r_i]$ 变为可以走,求经过的位置的价值和减去总代价的最大值。
解法
显然在第二行经过的位置是一段连续的区间,所以选择的操作的区间也是连续的,且除了第一段和最后一段区间之外全部会走满。我们把总价值拆成两部分:$a_l-b_{l-1}$ 与 $b_r+(c_n-c_{r-1})$,其中 $a,b,c$ 分别是三行的价值, $l,r$ 是进入和离开第二行的位置。我们考虑把第一部分贡献转移到最后一段区间:首先把 $a_j-b_{j-1}$ 转移到 $f_j$,由于第一个和中间的区间都是走到了区间末尾的,所以区间 $i$ 的贡献就是把 $\max\limits_{l_i \leq j \leq r_i} f_j-k_i$ 贡献到 $f_{r_i}$。用线段树维护。
然后我们需要把在同一个区间的两种贡献合并,也就是对于区间 $i$,对于任意 $j,p \in [l_i,r_i],j \leq p$,把 $f_j + b_p+(c_n-c_{p-1}) -p_i$ 贡献到总答案。这里需要保证 $j \leq p$,也可以用线段树维护,每次把左子树最大的 $f_j$ 和右子树最大的 $b_p+(c_p-c_{p-1})$ 相加贡献到答案即可。
code
code
1 |
|