T1

100%

满分当且仅当实际得分等于满分,即判断 a=ba=b

  • a=ba=b,输出 Accepted
  • 否则输出 Unaccepted

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

T2

100%

按照题意依次处理每一件装备,并始终保存当前战斗力对 998244353998244353 取模后的值 ansans

  • 遇到 A x,令 ans=(ans+x)mod998244353ans=(ans+x)\bmod 998244353

  • 遇到 B x,令 ans=(ans×x)mod998244353ans=(ans\times x)\bmod 998244353

每次操作后输出 ansans 即可。乘法计算的中间结果需要使用 long long。

时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)

T3

100%

怪物是否能被击败取决于它出现时的战斗力,因此必须按照时间顺序处理怪物,而不是按照输入顺序处理。

将每个怪物保存为三元组 (ti,xi,yi)(t_i,x_i,y_i),按照 tit_i 从小到大排序。随后依次处理:

  • 如果当前战斗力 sxis\ge x_i,则击败该怪物,令 s:=s+yis:=s+y_i
  • 否则战斗力不变。

所有 tit_i 互不相同,因此排序后不会出现同一时刻的处理顺序问题。

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

T4

40%

n15n\le 15 时,可以枚举每天进行的三种操作,并检查游戏天数、游戏是否连续以及做题专题是否交替,取所有合法方案的最大收益。

时间复杂度 O(3n)O(3^n)

100%

“相邻两道题目的专题不同”中的两道题不一定在相邻两天,因此只记录前一天做了什么是不够的。我们需要同时记录:

  • 最近一次刷题的专题;
  • 前一天是否在玩游戏。

dpi,j,t,gdp_{i,j,t,g} 表示已经安排完前 ii 天、恰好玩了 jj 天游戏时的最大收益,其中:

  • t{0,1,2}t\in\{0,1,2\}:最近一次刷题的专题,00 表示套路题,11 表示思维题,22 表示还没有刷过题;
  • g{0,1}g\in\{0,1\}:前一天是否在玩游戏。

初始时只有:

dp0,0,2,0=0dp_{0,0,2,0}=0

其余状态均为负无穷。

考虑第 i+1i+1 天,设其收益为 ai+1,bi+1a_{i+1},b_{i+1},从每个合法状态进行下面的转移。

1.玩游戏:只有前一天没有玩游戏,即 g=0g=0 时才可以选择:

$$dp_{i+1,j+1,t,1}=\max(dp_{i+1,j+1,t,1},dp_{i,j,t,0}) $$

最近一次刷题的专题 tt 保持不变。

  1. 刷套路题:只有 t0t\ne 0 时才可以选择:
$$dp_{i+1,j,0,0}=\max(dp_{i+1,j,0,0},dp_{i,j,t,g}+a_{i+1}) $$
  1. 刷思维题:只有 t1t\ne 1 时才可以选择:
$$dp_{i+1,j,1,0}=\max(dp_{i+1,j,1,0},dp_{i,j,t,g}+b_{i+1}) $$

处理完 nn 天后,在所有 dpn,m,t,gdp_{n,m,t,g} 中取最大值即可。

时间复杂度 O(nm)O(nm),空间复杂度 O(nm)O(nm)

T5

100%

先固定所有人的总安检顺序。由于 nn 个人互不相同,总顺序共有 n!n! 种。

对于一个固定的总顺序,设某一批有 kk 个人。该批需要从 mm 个不同安检口中选择 kk 个,并且不记录人与安检口之间的具体对应关系,因此这一批的方案数为 (mk)\binom{m}{k}

接下来只需要统计:将固定顺序的前 nn 个人划分成若干个连续非空批次,每一批大小不超过 mm,且大小为 kk 的批次带有 (mk)\binom{m}{k} 种选择时,共有多少种方案。

fif_i 表示固定总顺序后,安排完前 ii 个人的方案数。初始值为:f0=1f_0=1

枚举最后一批的人数 kk。最后一批之前的 iki-k 个人有 fikf_{i-k} 种安排,最后一批有 (mk)\binom{m}{k} 种安检口集合,因此:

fi=k=1min(i,m)fik(mk)f_i=\sum_{k=1}^{\min(i,m)}f_{i-k}\binom{m}{k}

最终答案为 n!fnn!\,f_n

时间复杂度 O(nmin(n,m))O(n\min(n,m)),空间复杂度 O(n)O(n)

T6

100%

对于一次 2 l r k 操作,如果选择第 ii 个专题,那么从它的 aia_i 道题中选择 kk 道的方案数为 (aik)\binom{a_i}{k}。由于一次集训只能选择一个专题,所以查询的答案是:

i=lr(aik)\sum_{i=l}^{r}\binom{a_i}{k}

问题转化为:维护序列 aa 的区间加,并查询区间内组合数之和,其中 k8k\le 8

K=8K=8。对于线段树的每个结点和每个 0jK0\le j\le K,维护:

Sj=i 在该结点区间内(aij)S_j=\sum_{i\text{ 在该结点区间内}}\binom{a_i}{j}

其中 (x0)=1\binom{x}{0}=1,所以 S0S_0 就是该结点对应的区间长度。

合并两个儿子时,将对应的 SjS_j 分别相加即可。查询 2 l r k 时,查询区间的 SkS_k 即为答案。

如果一次修改使 aia_i 变为 ai+ya_i+y,由根据范德蒙德卷积有:

$$\binom{a_i+y}{j} =\sum_{t=0}^{j}\binom{a_i}{t}\binom{y}{j-t} $$

对结点区间内的所有 ii 求和,得到修改后的维护值:

Sj=t=0jSt(yjt)S'_j =\sum_{t=0}^{j}S_t\binom{y}{j-t}

因此,对一个完整覆盖的线段树结点,可以先求出:

cd=(yd)(0dK)c_d=\binom{y}{d}\quad(0\le d\le K)

然后在 O(K2)O(K^2) 时间内更新整个 SS。计算新的 SS 时必须使用修改前的各个 StS_t,可以复制一份旧数组后再转移。

下传标记时,分别对两个儿子的 SS 值执行同样的操作即可。

每次修改和查询的时间复杂度均为 O(K2logn)O(K^2\log n),空间复杂度为 O(nK)O(nK)

0 comments

No comments so far...