扩大
缩小

牛客小白月赛108 题解(出题人题解)

比赛链接

A

  • $y=0$ 的情况,答案是 $0$。
  • $y>0$ 的情况,我们把每两次按钮先捆绑在一起,算出 $k=\lceil \frac{y}{x+1} \rceil$。
    • 然后判断是否可以在前 $2k-1$ 次就完成任务,即判断 $(k-1)(x+1)+1 \ge y$。
    • 如果上式成立,答案是 $2k-1$,否则是 $2k$。

B

提供一个比较暴力的做法。对于至少有两位的数字,它是 $4$ 的倍数,等价于最后两位组成的数是 $4$ 的倍数。

记录出现的所有数位(以及次数),然后枚举 $1 \le i,j \le 9$。

  • 如果 $i \neq j$,那么可以输出 YES 的条件是 $10i+j$ 是 $4$ 的倍数,且数位 $i,j$ 都有在原数出现。
  • 如果 $i = j$,那么可以输出 YES 的条件是 $10i+j$ 是 $4$ 的倍数,且数位 $i$ 在原数出现至少两次。

注意特判一位数的情况。

C

由第一个式子:异或和不是 $0$,那么它一定大于 $0$。

将这个不等式代入第二个式子,那么必有:$\text{lcm}{(c_1,c_2,...,c_m)} < 2\times \min(c_1,c_2,...,c_m)$。

而最小公倍数一定是序列每个数(包括最小数)的倍数,因此 $\text{lcm}{(c_1,c_2,...,c_m)}=\min(c_1,c_2,...,c_m)$。

所以,要求 $c_1,c_2,...,c_m$ 每个数相等。

然后别忘了异或和不是 $0$,结合上一行的结论可知我们只能选奇数个相等的数。

所以如果某个数在序列出现奇数次可以一次删空;如果出现偶数次就需要删除两次(偶数 = 1+奇数)。

D

为了让 $\text{MEX}$ 尽量大,我们应该让所有不为 $0$ 的 $t_i$ 值都不一样。

同时我们想要所有数的和尽量小,根据贪心策略,对于越大的 $t_i$ ,对应的 $i$ 应该越小。

例如,我们想要让 $\text{MEX}$ 等于 $4$,构造的总和最小的序列是 $1,1,1,2,2,3$,这样 $t_1=3,t_2=2,t_3=1$。

因此,当 $\text{MEX}$ 等于 $k+1$ 时,$M$ 的下限应该是 $v_k=$ $\sum_{i=1}^k i(k-i+1)=\frac{k^2(k+1)}{2}-\frac{k(k+1)(2k+1)}{6}+\frac{k(k+1)}{2}$。

化简后是 $v_k=\frac{k^3+3k^2+2k}{6}$。

对于每个询问,可以二分出最大的一个不超过 $M$ 的 $v_k$,输出 $k+1$ 即可。注意二分过程不要溢出了。

P.S. 由于这个数这是 $O(k^3)$ 级别的,也可以暴力求出所有在 $10^{18}$ 以内的 $v_k$。

E

对于一个节点 $x$,它的颜色会波及到 $1$ 与 $x$ 的链上所有点的贡献。

假设 $p$ 初始的子树内红点有 $r_p$ 个,蓝点有 $b_p$ 个。假设节点 $x$ 在 $p$ 节点的子树内。

  • 若 $x$ 由红变蓝,且 $r_p-b_p \ge 2$,那么 $D(p)$ 会减少 $2$。
  • 若 $x$ 由红变蓝,且 $r_p -b_p \le 0$,那么 $D(p)$ 会增加 $2$。
  • 若 $x$ 由蓝变红,不等式左边改成 $b_p-r_p$ 即可判断。

因此我们 DFS 两次。

  • 第一次统计每个节点所在子树的红蓝点个数。
  • 第二次对于每个 $x$,树上前缀和求出 $1$ 到 $x$ 的链上每个点 $p$ 中,满足 $r_p-b_p \ge 2$,$r_p-b_p \le 0$;$b_p-r_p \ge 2$,$b_p-r_p \le 0$ 的点数。根据节点 $x$ 颜色的变化情况得到 $D(p)$ 的变化量,再根据变化量的正负统计答案数。

 

F

利用若干个 vector 分别记录每个值的出现位置集合。我们先把原序列每个数取出,然后按照数值**从大到小**的顺序把数字放回。

放回的过程中,假设当前考虑等于 $k$ 的数(先不放回),那么所有满足 $a_i=a_j=k$ 的区间 $[i,j]$,里面放回的数都大于 $k$。

所以每个区间的贡献,等于放回区间内的数的个数。求完贡献后把所有等于 $k$ 的数放回。

以上操作可以用树状数组快速维护、查询。

区间数太多了怎么办?$d(i,j)$ 怎么乘上去?我们可以只先关注**极小有效区间**,即满足 $a_i=a_j$ 但中间不存在等于 $a_i$ 的数的区间 $[i,j]$。

区间长度为奇数,等价于左右端点的奇偶性相同;区间长度为偶数,等价于端点的奇偶性相反。

所以对于极小区间 $[i,j]$,假设四个量,这都可以用线性复杂度求出:

  • $[1,i]$ 中等于 $a_i$ 且下标是奇数的元素个数 $x$; 
  • $[j,n]$ 中等于 $a_i$ 且下标是奇数的元素个数 $y$; 
  • $[1,i]$ 中等于 $a_i$ 且下标是偶数的元素个数 $z$; 
  • $[j,n]$ 中等于 $a_i$ 且下标是偶数的元素个数 $w$。 

那么区间 $[i,j]$ 对整个序列的贡献是 $c(i,j) \times (xy+zw+2zy+2xw)$。

这个贡献可以代表所有包含 $[i,j]$ 且端点等于 $a_i$ 的区间,在 $[i,j]$ 这一段产生的贡献和。

容易证明极小有效区间数是 $\mathcal{O}(n)$ 的,所以总时间复杂度是 $\mathcal{O}(n \log n)$。

posted @ 2024-12-27 21:46  HoshizoraZ  阅读(67)  评论(0)    收藏  举报