T1

100%

因为 bbdd 都是正数,所以两边同时乘上 b×db\times d 后中间的符号不变。

所以只需要比较 a×da\times db×cb\times c 的关系,如果 a×d>b×ca\times d>b\times c 输出 >,如果 a×d<b×ca\times d<b\times c 输出 <,如果 a×d=b×ca\times d=b\times c 输出 =

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

T2

60%

11 开始从小到大枚举整数 xx ,找到最大的 xx 满足 x2Nx^2\leq N,答案即为 x2x^2

时间复杂度 O(N)O(\sqrt{N})

100%

满足 x2Nx^2\leq N 的最大整数 xx 实际上就是 N\lfloor \sqrt{N}\rfloor

如果使用 sqrt\text{sqrt} 函数来求 N\lfloor \sqrt{N}\rfloor,会因为精度误差而出错,比如 sqrt(999999999999999999)\text{sqrt}(999999999999999999) 会被计算为 10000000001000000000

所以要使用精度更高的 sqrtl\text{sqrtl} 函数来计算。

计算 x=sqrtl(N)x=\text{sqrtl}(N),答案即为 x2x^2

注意:sqrtl\text{sqrtl} 函数的返回值是实数类型的,将其赋值给一个 long long\text{long\ long} 类型的变量可以实现向下取整的效果。

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

T3

100%

在字符矩阵中,从外到内的第 ii 层正方形,四条边对应的格子分别是:

  • ii 行的第 ii 列到第 n+1in+1-i 列;
  • n+1in+1-i 行的第 ii 列到第 n+1in+1-i 列;
  • ii 列的第 ii 行到第 n+1in+1-i 行;
  • n+1in+1-i 列的第 ii 行到第 n+1in+1-i 行。

11n2\lceil \frac{n}{2}\rceil 枚举 ii,当 ii 是奇数时将第 ii 层正方形的四条边对应的格子赋值为 #;当 ii 是偶数时将第 ii 层正方形的四条边对应的格子赋值为空格。

完成所有赋值后再输出字符矩阵即可。

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

T4

20%

记最终合成白球的不同合成方案数量为 answansw,最终合成黑球的不同合成方案数量为 ansbansb

DFS\text{DFS} 枚举每一轮合成选择的两个球的位置,共有 (n1)!(n-1)! 种不同的位置选择方案。

每轮选好位置后,根据合成前这两个球的颜色,枚举合成的新球的颜色,继续 DFS\text{DFS} 枚举剩下球的合成。

最终如果合成为一个白球则 answansw 增加一,合成为一个黑球则 ansbansb 增加一。

时间复杂度 O((n1)!2n)O((n-1)!2^n)

40%

对于测试点#3~4,因为所有球都是白球,所以每轮合成的新球的颜色一定为白色,最终一定合成为一个白球。

此时不同合成方案之间仅有每轮合成选择的两个球的位置不同,答案即为 answ=(n1)!answ=(n-1)!ansb=0ansb=0

注意取模。

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

结合第一部分可以拿到 40%40\% 的分数。

100%

定义 dp[l][r][0]dp[l][r][0] 为将第 lrl\sim r 个球合成为一个白球的不同合成方案数量,dp[l][r][1]dp[l][r][1] 为将第 lrl\sim r 个球合成为一个黑球的不同合成方案数量。

考虑将第 lrl\sim r 个球合成为一个球的最后一轮合成,本轮合成选择的两个球分别是第 lil\sim i 个球合成出的球(称为球 AA)与第 i+1ri+1\sim r 个球合成出的球(称为球 BB),那么本轮合成的新球的颜色与球 AA 和球 BB 的颜色有关,且球 AA 的合成方案与球 BB 的合成方案是独立的,合成球 AA 所用的 ili-l 轮合成与合成球 BB 所用的 r(i+1)r-(i+1) 轮合成的相对顺序也是独立的。所以将第 lrl\sim r 个球合成为一个球的过程中,除最后一轮合成外剩下 rl1r-l-1 轮合成中,选择合成球 AAili-l 轮合成的位置有 Crl1il\text{C}_{r-l-1}^{i-l} 种选法。

用杨辉三角法预处理所有 0in0\leq i\leq n0ji0\leq j\leq i 的组合数 Cij\text{C}_i^j

如果第 ii 个球为白色,那么 dp[i][i][0]=1,dp[i][i][1]=0dp[i][i][0]=1,dp[i][i][1]=0;如果第 ii 个球为黑色,那么 dp[i][i][0]=0,dp[i][i][1]=1dp[i][i][0]=0,dp[i][i][1]=1

对于 l<rl<r 的情况,用三重循环进行区间DP:

  • 第一重循环从 22 开始枚举区间长度 lenlen
  • 第二重循环枚举区间的左端点 ll,此时区间的右端点 r=l+len1r=l+len-1
  • 第三重循环在 lr1l\sim r-1 中枚举 ii 表示将第 lrl\sim r 个球合成为一个球的最后一轮合成选择的两个球分别是第 lil\sim i 个球合成出的球 AA 与第 i+1ri+1\sim r 个球合成出的球 BB
  • 这种情况下,除最后一轮合成外剩下 rl1r-l-1 轮合成中,选择合成球 AAili-l 轮合成的位置有 Crl1il\text{C}_{r-l-1}^{i-l} 种选法;
  • 如果球 AA 和球 BB 颜色相同,以都是白色为例:最终只能合成出白球,球 AA 的合成方案有 dp[l][i][0]dp[l][i][0] 种,球 BB 的合成方案有 dp[i+1][r][0]dp[i+1][r][0] 种,合成对应的转移为 $dp[l][r][0]+=dp[l][i][0]\times dp[i+1][r][0]\times \text{C}_{r-l-1}^{i-l}$;
  • 如果球 AA 和球 BB 颜色不同,以球 AA 为白色且球 BB 为黑色为例:可以选择最终合成出黑球或白球,球 AA 的合成方案有 dp[l][i][0]dp[l][i][0] 种,球 BB 的合成方案有 dp[i+1][r][1]dp[i+1][r][1] 种,合成对应的转移为 $dp[l][r][0]+=dp[l][i][0]\times dp[i+1][r][1]\times \text{C}_{r-l-1}^{i-l}$ 以及 $dp[l][r][1]+=dp[l][i][0]\times dp[i+1][r][1]\times \text{C}_{r-l-1}^{i-l}$。

答案即为 answ=dp[1][n][0]answ=dp[1][n][0]ansb=dp[1][n][1]ansb=dp[1][n][1]

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

T5

20%

DFS\text{DFS} 枚举知识点的 n!n! 种学习顺序,对于每种顺序判断是否为合法的学习方案,每当找到一种的学习方案,让答案增加一。

时间复杂度 O(n!n)O(n!n)

60%

因为每个知识点最多只会有一个前置知识点,可以把这类前置关系看成树的结构,pip_iii 的父节点。

dp[i]dp[i] 表示只考虑以 ii 为根的子树内的知识点时,合法的学习方案的数量。记 siz[i]siz[i] 为以 ii 为根的子树内的知识点的数量。

考虑知识点 xxmm 个子节点,分别是 y1,y2,,ymy_1,y_2,\dots,y_m 的情况下,如何计算 dp[x]dp[x]

xx 一定是第一个学习的知识点。对于以 xx 的不同子节点为根的各子树,每个子树的知识点对应的合法学习方案独立,不同子树的知识点的相对学习顺序也是独立的:

  • y1y_1 为根的子树,有 siz[y1]siz[y_1] 个知识点需要学习,即需要从 siz[x]1siz[x]-1 个剩余的位置中,选出 siz[y1]siz[y_1] 个位置给子树 y1y_1 学习,这 siz[y1]siz[y_1] 个知识点对应的合法学习方案为 dp[y1]dp[y_1],共有 Csiz[x]1siz[y1]×dp[y1]\text{C}_{siz[x]-1}^{siz[y_1]}\times dp[y_1] 种情况;
  • y1y_1 为根的子树,有 siz[y2]siz[y_2] 个知识点需要学习,即需要从 siz[x]1siz[y1]siz[x]-1-siz[y_1] 个剩余的位置中,选出 siz[y2]siz[y_2] 个位置给子树 y2y_2 学习,这 siz[y2]siz[y_2] 个知识点对应的合法学习方案为 dp[y2]dp[y_2],共有 $\text{C}_{siz[x]-1-siz[y_1]}^{siz[y_2]}\times dp[y_2]$ 种情况;
  • 以此类推,以 yiy_i 为根的子树,有 siz[yi]siz[y_i] 个知识点需要学习,即需要从 siz[x]1j=1i1siz[yj]siz[x]-1-\sum_{j=1}^{i-1}siz[y_j] 个剩余的位置中,选出 siz[yi]siz[y_i] 个位置给子树 yiy_i 学习,这 siz[yi]siz[y_i] 个知识点对应的合法学习方案为 dp[yi]dp[y_i],共有 $\text{C}_{siz[x]-1-\sum_{j=1}^{i-1}siz[j]}^{siz[y_i]}\times dp[y_i]$ 种情况;
  • 所以 $dp[x]=\prod_{i=1}^{m}(\text{C}_{siz[x]-1-\sum_{j=1}^{i-1}siz[y_j]}^{siz[y_i]}\times dp[y_i])$。

用杨辉三角法预处理所有 0in0\leq i\leq n0ji0\leq j\leq i 的组合数 Cij\text{C}_i^j

先进行第一次 DFS\text{DFS} 计算出 sizsiz 数组。

再进行第二次 DFS\text{DFS} 计算 dpdp 数组:

  • 初值为 dp[x]=1dp[x]=1
  • 枚举 xx 的子节点,当枚举到 xx 的第 ii 个子节点 yiy_i 时,维护 num=siz[x]1j=1i1siz[yj]num=siz[x]-1-\sum_{j=1}^{i-1}siz[y_j],转移为 $dp[x]=dp[x]\times(\text{C}_{num}^{y_i}\times dp[y_i])$。

由于可能存在多个 pi=0p_i=0 的知识点,可以把 00 看成树的根,从 00 出发进行 DFS\text{DFS},答案就是 dp[0]dp[0]

算法的时间复杂度瓶颈在于用杨辉三角法预处理组合数。

注意:三个或更多的数相乘可能会超出 long long\text{long\ long} 范围,要及时取模。

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

100%

预处理模意义下阶乘 fac[i]=i!fac[i]=i! 和模意义下阶乘的逆元 ifac[i]=1i!ifac[i]=\frac{1}{i!}。过程中只需要在求 ifac[n]ifac[n] 时计算一次逆元。关于模意义下的逆元问题请同学们自行查阅资料。

在第二部分的基础上,将组合数的计算方式改为 $\text{C}_i^j=\frac{i!}{j!\times (i-j)!}=fac[i]\times ifac[j]\times ifac[i-j]$。

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

T6

10%

对于每个询问,对 xix_i 依次进行第 LiRiL_i\sim R_i 个修改即可。

注意取模。

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

30%

对于测试点#2~3,因为 ai=0a_i=0,所以不论对 xix_i 依次进行第 LiRi1L_i\sim R_i-1 个修改后的结果是多少,都会将结果乘上 aRi=0a_{R_i}=0 再加上 bRib_{R_i}

因此第 ii 个询问的答案为 bRib_{R_i}

时间复杂度 O(n+m)O(n+m)

结合第一部分可以拿到 30%30\% 的分数。

50%

对于测试点#4~5,因为 bi=0b_i=0,所以对 xx 进行第 ii 个修改也就是令 x=x×aix=x\times a_i

因此第 ii 个询问的答案为 xi×j=LiRiajx_i\times \prod_{j=L_i}^{R_i} a_j

乘法具有结合律:计算三个整数相乘时,先把前两个数相乘,再和另外一个数相乘,或先把后两个数相乘,再和另外一个数相乘,结果不变。乘法的结合律可以推广到多个整数相乘的情况。

预处理 aia_i 的前缀乘积 f[i]=j=1iajf[i]=\prod_{j=1}^{i} a_j,以及模意义下 f[i]f[i] 的逆元 g[i]=1f[i]g[i]=\frac{1}{f[i]}。其中 g[0]=1g[0]=1

ii 个询问的答案为 xi×f[Ri]×g[Li1]x_i\times f[R_i]\times g[L_i-1]

注意:三个或更多的数相乘可能会超出 long long\text{long\ long} 范围,要及时取模。

时间复杂度 O(n+m)O(n+m)

结合第一、第二部分可以拿到 50%50\% 的分数。

100%

考虑对 xx 先进行参数为 ccdd 的修改,再进行参数为 eeff 的修改,结果为 $e\times(c\times x+d)+f=e\times c\times x+e\times d+f$。

也就是说,可以把先进行参数为 ccdd 的修改再进行参数为 eeff 的修改的情况,合并为进行一个参数为 e×ce\times ce×d+fe\times d+f 的新修改。

并且修改也具有结合律:依次进行三个修改时,先把前两个修改合并,再与另外一个修改合并,或先把后两个修改合并,再与另外一个修改合并,只要保证合并时修改间的相对位置不变,结果不变。修改的结合律也可以推广到多个修改依次进行的情况。

因此我们用线段树维护区间内修改依次合并出的新修改,可以用结构体来保存:tre[i]tre[i] 保存线段树上节点 ii 对应的区间内的修改依次合并出的新修改,其中 tre[i].atre[i].a 表示这个新修改的参数 aatre[i].btre[i].b 表示这个新修改的参数 bb

ask(x,L,R)ask(x,L,R) 表示第 LRL\sim R 个修改依次合并出的新修改,askask 函数的返回值为结构体。

对于第 ii 个询问,计算 ans=ask(Li,Ri)ans=ask(L_i,R_i),答案为 ans.a×xi+ans.bans.a\times x_i+ans.b

时间复杂度 O(n+mlog(n))O(n+m\log(n))

0 comments

No comments so far...