A

题目要求判断给定的小时数 xx 之后,时间是否处于 6:006:0018:0018:00 之间。

已知起始时间是 00:0000:00。经过 xx 小时后,当前时刻的小时数为 h=xmod24h = x \bmod{24}

只需要判断 6h186 \le h \le 18 是否成立即可。

  • 如果成立,输出 I love Shawarma
  • 否则,输出 Shawarma is the best food

时间复杂度 O(1)O(1)

B

我们需要统计有多少个 ii 满足存在区间 [l,r][l, r] 使得 j=lraj=kai\sum_{j=l}^r a_j = k - a_i

targeti=kaitarget_i = k - a_i。如果 targeti0target_i \le 0,显然不存在这样的区间(因为 aia_i 均为正整数),可以直接忽略。

对于 targeti>0target_i > 0 的情况,我们需要快速判断数组中是否存在和为 targetitarget_i 的子数组。

注意到数据范围 n,k5000n,k \le 5000,我们可以使用 O(n2)O(n^2) 的时间预处理出所有可能的区间和。

总时间复杂度 O(N2)O(N^2),空间复杂度 O(N)O(N)

C

由于每一列的掉落是相互独立的,我们可以分别处理每一列。

对于每一列,箱子掉落的规则如下:

  1. 箱子会掉落到其下方最近的障碍物(-)或堆叠的箱子/废墟之上。
  2. 我们可以从下往上(行号 nn11)遍历每一列,维护一个变量 pospos,表示当前物体掉落后的预期放置行号。一开始 pos=npos = n

如果从下往上遍历时(假设此时遍历到第 ii 个),会有下面几种情况:

  • 遇到了 -,说明下一个物体只能落到这个平台上方,将 pospos 设置为 i1i - 1
  • 遇到了箱子,我们可以先计算掉落距离 posipos - i,然后根据题目要求判断其是否变成*,接着我们把 pospos 修改为 pos1pos - 1
  • 遇到了 .,直接跳过。

时间复杂度为 O(nm)O(nm)

D

假设 apiadu 解决 kk 个题目,那么 jiangly 就要解决 nkn - k 个题目。

此时,疲劳值产生的时间是固定的,为:

x=0k1cx+y=0nk1dy\sum_{x=0}^{k-1} c_x + \sum_{y=0}^{n-k-1} d_y

现在的目标是让 $\sum_{i \in S_{\text{apiadu}}} a_i + \sum_{j \in S_{\text{jiangly}}} b_j$ 最小。(其中 SapiaduS_{\text{apiadu}}apiadu 选择的题目。 SjianglyS_{\text{jiangly}}jiangly 选择的题目。

将式子变形一下:

$$\begin{aligned} \sum_{i \in S_{\text{apiadu}}} a_i + \sum_{j \in S_{\text{jiangly}}} b_j & = \sum_{i \in S_{api}} a_i + (\sum_{\text{all}} b - \sum_{i \in S_{\text{apiadu}}} b_i) \\ &= \sum_{\text{all}} b + \sum_{i \in S_{\text{apiadu}}} (a_i - b_i) \end{aligned} $$

其中 allb\sum_{\text{all}} b 是常数。为了使总时间最小,我们需要在确定了 kk 的情况下,选择 kk 个题目进入集合 SapiaduS_{\text{apiadu}},使得这 kk 个题目的 (aibi)(a_i - b_i) 的和最小。

故只需要选择 (aibi)(a_i - b_i)kk 个题目给 apiadu 做就能让时间最小。

利用排序和前缀和可以 O(1)O(1) 算出 apiadu 解决 kk 个题的最小时间。枚举 kk 即可。

时间复杂度为 O(nlogn)O(n \log n)

E

先将 BB 内的点按照 aa 的值从小到大排序,考虑枚举排序后 BB 中最编号最大的不在极大匹配中的编号,不妨设为 kk

此时我们把点分成 44 类:

  1. AA 集合中 [1,ak][1,a_k],称为集合 11
  2. AA 集合中 [ak+1,n][a_k + 1,n],称为集合 22
  3. BB 集合中 [1,k1][1 , k - 1],称为集合 33
  4. BB 集合中 [k+1,n][k + 1, n],称为集合 44

可以发现,集合 11 和集合 44 内的所有点在匹配上。(若集合 11 内存在没有被匹配的点,那么可以让 kk 和这个点进行匹配,与题目假设不符;若集合 44 内存在没有被匹配的点,那么 kk 就不是编号最大的不在极大匹配中的点。)

那么此时匹配内的边会是在下面几种情况:

  1. 集合 11 \leftrightarrow 集合 33
  2. 集合 11 \leftrightarrow 集合 44
  3. 集合 22 \leftrightarrow 集合 44

对于第一种情况,我们考虑计算其方案数,考虑动态规划。 设 fi,jf_{i,j} 表示考虑 BB 中排序后的前 ii 个点(即 B1BiB_1 \dots B_i),在 AA 中恰好匹配了 jj 个点的方案数。 转移方程为:

$$f_{i,j} = f_{i-1, j} + f_{i-1, j-1} \times \max(0, a_i - (j-1)) $$

含义是:BiB_i 要么不匹配(fi1,jf_{i-1,j}),要么匹配(从 fi1,j1f_{i-1, j-1} 转移)。如果匹配,BiB_i 可以连接 1ai1 \dots a_i 范围内的任意点,但其中 j1j-1 个点已经被前面的 BB 点占用了,所以有 ai(j1)a_i - (j-1) 种选择。

对于固定的 kk,我们可以枚举 集合 11 与集合 33 之间的连边数量,设为 xx。 这部分的方案数即为 fk1,xf_{k-1, x}

接下来处理剩余的情况:

  1. 填补集合 11 的剩余空位(处理情况 22): 集合 11A[1ak]A[1 \dots a_k])的总大小为 aka_k。既然集合 33 占用了 xx 个位置,那么集合 11 中还剩下 akxa_k - x 个空位。 根据极大匹配的定义(以及 kk 是最大未匹配点的假设),akxa_k - x 个空位必须被集合 44 中的点完全覆盖

  2. 集合 44 的分配(处理情况 33): 集合 44 共有 nkn-k 个点。 其中,必须有 akxa_k - x 个点用来填补集合 11 的空位。 那么,集合 4 中剩余的点数为:

    z=(nk)(akx)z = (n - k) - (a_k - x)

    zz 个点必须与 集合 22 中的点进行匹配。

  3. 计算总方案数: 由于集合 44 中的点满足 ajaka_j \ge a_k,所以它们都可以填到集合 11 的空位上。 因此,计算步骤如下:

  4. 从集合 44 中选出 zz 个点与集合 2 匹配。考虑用动态规划计算这一步。设 g[k][z]g[k][z] 表示从 Bk+1nB_{k+1 \dots n} 中选 zz 个点匹配到 Aak+1nA_{a_k+1 \dots n} 的方案数。

  5. 集合 44 中剩下的 akxa_k - x 个点,用来填充集合 11akxa_k - x 个特定空位。由于点是不同的,空位也是不同的,这部分的方案数是全排列 (akx)!(a_k - x)!

故对于固定的 kk,其对答案的贡献为:

$$\sum_{x} \left( f_{k-1, x} \times g[k] [(n-k) - (a_k - x)] \times (a_k - x)! \right) $$

如何计算 gg ?考虑通过 g[k]g[k] 转移到 g[k1]g[k - 1]

可以发现,当 kk 减少 11 时,集合 22 会新增 L=akak1L = a_k - a_{k - 1} 个点,且这些点都可以被集合 44 内的点连接。

我们可以把这 LL 个空位一个一个加入,假设我们要加入一个新的点,设 g0[z]g_0[z] 为更新前的状态,g1[z]g_1[z] 为更新后的状态,那么会有以下两种情况:

  1. 这个点没有被使用,此时贡献为 g0[z]g_0[z]
  2. 这个点被使用,此时贡献为 g1[z1]×(Mz+1)g_1[z - 1] \times (M - z+ 1),其中 MM 表示集合 44 的大小。

由于新增了 LL 个位置,我们只需要将上述过程重复 LL 次即可。

最后加上所有 BB 点都匹配(完美匹配)的情况,即 fn,nf_{n,n}

时间复杂度为 O(n2)O(n^2)

F

不妨设以 11 为根,对于某个节点 uu,先考虑如何计算以 uu 为起点的子树内所有路径权值之和。

定义S(u,v)S(u, v)uvu \to v 的路径上所有 sqr k 操作参数 kk 的和。 根据题目定义,d(u,v)d(u, v) 的计算过程为:初始值 11,依次经过路径操作。 若路径上某条边为 * C,且该边之后(在通往 vv 的方向上)累积经过了 SS' 次平方操作,则因子 CC 在最终结果中会变为 C2SC^{2^{S'}}

由于指数 SS 可能很大,根据费马小定理和扩展欧拉定理,我们有如下性质:

  • 在模 P=998244353P=998244353 下,底数的指数是模 P1P-1 的。
  • 2S(modP1)2^S \pmod{P-1} 具有长度为 2323 的前缀和长度为 2424 的循环。
  • 故总共只有 23+24=4723 + 24 = 47 种本质不同的指数状态。我们将 SS 映射到 [0,46][0, 46] 的范围内,记为 Map(S)\text{Map}(S)

所以我们按照这个指数状态对路径进行分类。

故设 f[u][i]f[u][i] 表示 uu 的子树中,所有满足 Map(S(u,v))=i\text{Map}(S(u, v)) = i 的节点 vv 的路径值之和,即:

$$f[u][i] = \left( \sum_{v \in \text{subtree}(u), \ \text{Map}(S(u,v))=i} d(u,v) \right) \bmod P $$

此时考虑转移,当合并子节点 vvuu,且边 uvu \to v 的值为 kk 时:

  • 假设边为 sqr k: 从 uu 出发的第一步是对初始值 11 进行平方,12k=11^{2^k}=1,故数值不变。 但是对于子树中的任意节点 ww,有 S(u,w)=S(v,w)+kS(u, w) = S(v, w) + k。 这意味着原本属于状态 ii 的路径,现在的状态变为 i+ki+k。 故转移方程为:

    f[u][i+k]f[u][i+k]+f[v][i]f[u][i+k] \leftarrow f[u][i+k] + f[v][i]
  • 假设边为 * k: 从 uu 出发的第一步是将初始值 11 乘以 kk,变为 kk。 此后从 vv 继续走到子树节点 ww,这个因子 kk 将会被后续的 sqr 操作平方 S(v,w)S(v, w) 次。 即新的路径值为 d(u,w)=k2S(v,w)×d(v,w)d(u, w) = k^{2^{S(v, w)}} \times d(v, w)。 此时路径的 SS 值没有变化,S(u,w)=S(v,w)S(u, w) = S(v, w)。 故对于状态 ii(即 S(v,w)=iS(v, w)=i),所有路径的值都要乘以 k2ik^{2^i}。 转移方程为:

    $$f[u][i] \leftarrow f[u][i] + f[v][i] \times k^{2^i} $$

此时 j=1nd(1,j)\sum_{j=1}^{n} d(1, j) 的答案为 i=046f[1][i]\sum_{i=0}^{46} f[1][i]

其他位置的答案,可以通过换根 dp 来解决,这里不再赘述。

时间复杂度为 O(47×n)O( 47\times n)

0 comments

No comments so far...