NOIP 第十五次

时效性

A

观察规律,发现 $t$ 次变换后,二元组变为 $(ak+b(k-2^t),a(1-k)+b(2^t-k+1))$,其中 $k\in[1,2^t]$,

显然 $a+b\ne c+d$ 时不可行,$a+b=c+d$ 时只需找到令 $a$ 变为 $c$ 的最少步数,因为此时 $b$ 一定变为 $d$,

形式化地,需要找出最小的 $t$,使得其对应的 $k=\dfrac{c+2^tb}{a+b}\in[1,2^t]$,

可以发现最小的 $t$ 不会超过 $\log_2p$,于是直接枚举 $t$ 即可。

B

前 $n-18$ 个数贪心分配(当前哪个集合和更小,就给哪个集合),分配完后两集合的和的差 $\Delta$ 一定在 $[-W,W]$ 内,

数据随机,所以可以认为从后 $18$ 个数中选一些给第一个集合,选一些给第二个集合,给两集合选出的数的和的差一定可以取遍 $[-W,W]$,

所以搜出一种方案使得这个差为 $-\Delta$ 即可。

C

记 $s_u$ 表示 $u$ 的子树大小。考虑一个点 $u$ 的工资何时可以被知道:

  1. $s_u>k$:可以发现,$u$ 的工资可以被知道当且仅当 $u$ 没有兄弟。
  2. $1<s_u\le k$:可以发现,$u$ 的工资不可能被知道。
  3. $s_u=1$:可以发现,$u$ 的工资可以被知道,当且仅当 $u$ 没有兄弟,且 $u$ 的父亲有不少于 $k-1$ 个兄弟,且这些兄弟 $v$ 要么是叶子,要么 $s_v>k$。

设 $f_u$ 表示 $u$ 子树里最多知道多少个点的工资,考虑进行怎样的操作:

  1. 建议不理:$f_u=\sum f_v$。
  2. 只留一个 $s_v>k$ 的孩子:$f_u=1+\max\limits_{s_v>k}f_v$
  3. 若 $u$ 有不少于 $k$ 个孩子,还可以把一个 $s_v>1$ 且 $f_v=0$ 的孩子删到 $s_v=2$,然后把其他 $s_v\le k$ 的孩子删到 $s_v=1$:$f_u=1+\sum f_v$。

三种方案取最大值即可。

D

$f_i$ 表示 $[1,i]$ 划分权值和,$h_i$ 表示 $[1,i]$ 形成的十进制数模 $998244353$,

$$ \begin{aligned} f_i&=\sum\limits_{j=0}^{i-1}f_j\times(h_i-h_j\times10^{i-j})\\ &=\sum\limits_{j=0}^{i-1}f_j\times h_i-\sum\limits_{j=0}^{i-1}f_j\times h_j\times 10^{i-j}\\ &=h_i\sum\limits_{j=0}^{i-1}f_j-10^i\sum\limits_{j=0}^{i-1}f_j\times h_j\times 10^{-j} \end{aligned} $$

posted @ 2023-11-15 22:17  5k_sync_closer  阅读(2)  评论(0编辑  收藏  举报  来源