T1

100%

不断将 xmod6x \bmod 6 的余数保存起来,然后将 xx 除以 66,直到 xx 变为 00

这样求出的是 xx 在六进制下从低位到高位的每一位数字,但输出的时候要从高位开始输出,所以将保存下来的余数从后往前输出。

时间复杂度 O(log(x))O(\log(x))

T2

100%

答案分为以下两种情况:

  • x>yx>y,此时 xy=xy|x-y|=x-y,当 xx 取最大奇数,yy 取最小偶数时,xy|x-y| 最大;
  • x<yx<y,此时 xy=yx|x-y|=y-x,当 xx 取最小奇数,yy 取最大偶数时,xy|x-y| 最大;

分别求出数组 AA 中最大奇数 Max1Max_1、最大偶数 Max2Max_2、最小奇数 Min1Min_1、最小偶数 Min2Min_2。如果 AA 中同时存在奇数和偶数,答案即为 max(Max1Min2,Max2Min1)\max(Max_1-Min_2,Max_2-Min_1)

注意判断 AA 中只有奇数或者偶数的情况。

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

T3

50%

两重循环枚举区间左端点 LL 和区间右端点 RR,如果子区间 [L,R][L,R] 的区间和是 kk 的倍数,答案加一。

维护 AA 的前缀和 s[i]=j=1iAjs[i]=\sum_{j=1}^i A_j,将区间和转化为两个前缀和的差分,所以只需判断 (s[R]s[L1])modk(s[R]-s[L-1])\bmod k 是否等于 00

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

100%

(s[R]s[L1])modk=0(s[R]-s[L-1])\bmod k=0 等价于 (s[R]modk)=(s[L1]modk)(s[R] \bmod k)=(s[L-1] \bmod k)

因此我们只需要枚举右端点 RR,维护 cnt[x]cnt[x] 表示对于 0iR10\leq i\leq R-1 有多少个 ii 满足 s[i]modk=xs[i] \bmod k=x,答案增加 cnt[s[R]%k]cnt[s[R]\%k]

初始只有 cnt[0]=1cnt[0]=1。当右端点从 R1R-1 变为 RR 时,cnt[s[R1]%k]cnt[s[R-1]\%k] 需要增加一。

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

T4

40%

V=max{a,b,c,n,m}V=\max\{a,b,c,n,m\},用杨辉三角法预处理所有 0iV0\leq i\leq V0ji0\leq j\leq i 的组合数 Cij\text{C}_i^j

用四重循环枚举某一类选人方案:

  • 第一重循环在 0n0\sim n 中枚举 iai_a,表示小N老师从 aa 名语文好的同学中选了 iai_a 名;
  • 第二重循环在 0n0\sim n 中枚举 ibi_b,表示小N老师从 bb 名数学好的同学中选了 ibi_b 名;
  • 第三重循环在 0m0\sim m 中枚举 jbj_b,表示小M老师从剩下 bibb-i_b 名数学好的同学中选了 jbj_b 名;
  • 第四重循环在 0m0\sim m 中枚举 jcj_c,表示小M老师从 aa 名语文好的同学中选了 jcj_c 名;
  • 如果 ia+ib=ni_a+i_b=njb+jc=mj_b+j_c=miaai_a\leq aib+jbbi_b+j_b\leq bjccj_c\leq c,说明这是一类可行的选人方案,答案增加这类方案的数量 $\text{C}_{a}^{i_a}\times\text{C}_{b}^{i_b}\times\text{C}_{b-i_b}^{j_b}\times\text{C}_{c}^{j_c}$。

时间复杂度 O(V2+n2m2)O(V^2+n^2m^2)

60%

对于测试点#5~6,因为 b=0b=0,所以小N老师只能从 aa 名语文好的同学中选人,小M老师只能从 cc 名英语好的同学中选人,答案为 Can×Ccm\text{C}_{a}^{n}\times \text{C}_{c}^{m}

时间复杂度 O(V2)O(V^2)

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

100%

观察第一部分计算一类选人方案的数量的式子,发现一类选人方案如果可行需要同时满足 ia=nibi_a=n-i_bjc=mjbj_c=m-j_b

因此只需要用两重循环枚举某一类选人方案:

  • 第一重循环在 0n0\sim n 中枚举 ii,表示小N老师从 bb 名数学好的同学中选了 ii 名;
  • 第二重循环在 0m0\sim m 中枚举 jj,表示小M老师从剩下 bib-i 名数学好的同学中选了 jj 名;
  • 如果 nian-i\leq ai+jbi+j\leq bmjcm-j\leq c,说明这是一类可行的选人方案,答案增加这类方案的数量 $\text{C}_{a}^{n-i}\times\text{C}_{b}^{i}\times\text{C}_{b-i}^{j}\times\text{C}_{c}^{m-j}$。

时间复杂度 O(V2)O(V^2)

T5

30%

对于每个询问,两重循环枚举每一个可能被当前炸弹炸到的格子 (px,py)(px,py)

  • max(1,xiwi)min(n,xi+wi)\max(1,x_i-w_i)\sim \min(n,x_i+w_i) 范围枚举 pxpx
  • max(1,yiwi)min(m,yi+wi)\max(1,y_i-w_i)\sim \min(m,y_i+w_i) 范围枚举 pypy
  • 如果 pxxi+pyyiwi|px-x_i|+|py-y_i|\leq w_i,说明 (px,py)(px,py) 会被当前炸弹炸到,答案增加 Cpx,pyC_{px,py}

时间复杂度 O(nm+qw2)O(nm+qw^2)

60%

当前炸弹能炸到第 aa 行的哪些格子。

对于 xiwiaxi+wix_i-w_i\leq a\leq x_i+w_i,只要满足 yi(wixia)byi+(wixia)y_i-(w_i-|x_i-a|)\leq b\leq y_i+(w_i-|x_i-a|),当前炸弹就能炸到 (a,b)(a,b)

所以答案等于 $\sum_{px=\max(1,x_i-w_i)}^{\min(n,x_i+w_i)}\sum_{py=L(px)}^{R(px)}C_{px,py}$,其中的 L(px)=max(1,yi(wixipx))L(px)=\max(1,y_i-(w_i-|x_i-px|))R(px)=min(m,yi+(wixipx))R(px)=\min(m,y_i+(w_i-|x_i-px|))

对每一行预处理格子分数的前缀和 f[i][j]=k=1jCi,kf[i][j]=\sum_{k=1}^j C_{i,k}

答案即为 $\sum_{px=\max(1,x_i-w_i)}^{\min(n,x_i+w_i)}f[px][R(px)]-f[px][L(px)-1]$。

时间复杂度 O(nm+qw)O(nm+qw)

100%

炸弹能炸到的格子形成了一个近似菱形的图案。以位于 (34)(3,4) 爆炸范围为 44 的炸弹为例,能炸到的格子为下图中黄色的部分(包括超出矩阵边界的):

这个菱形旋转 4545 度后就是矩形,旋转后的坐标可以映射到“斜坐标系”上。

定义斜坐标系:格子 (i,j)(i,j) 位于第 i+ji+j “斜行”,第 iji-j “斜列”,记作 <i+j,ij><i+j,i-j>。比如格子 (3,4)(3,4) 位于第 77 斜行,第 1-1 斜列,记作 <7,1><7,-1>

斜坐标系下格子 <a,b><a,b> 的分数记作 D[a][b]D[a][b]。遍历矩阵 CCD[i+j][ij]=C[i][j]D[i+j][i-j]=C[i][j],其余格子的分数都为 00

观察可得黄色部分涉及第 3113\sim11 斜行的 53-5\sim 3 斜列。

总结出规律:对于位于 (xy)(x,y) 爆炸范围为 ww 的炸弹,计算 xl=(xw)+yxl=(x-w)+yxr=(x+w)+yxr=(x+w)+yyl=(xw)yyl=(x-w)-yyr=x(yw)yr=x-(y-w),炸到的格子为 xlxrxl\sim xr 斜行的 ylyryl\sim yr 斜列。

定义 g[i][j]g[i][j] 表示所有满足 aia\leq ibjb\leq j 的格子 <a,b><a,b> 的分数之和,用二维前缀和的技巧预处理 g[i][j]=D[i][j]+g[i1][j]+g[i][j1]g[i1][j1]g[i][j]=D[i][j]+g[i-1][j]+g[i][j-1]-g[i-1][j-1]

对于每个询问,计算 xl=(xiwi)+yixl=(x_i-w_i)+y_ixr=(xi+wi)+yixr=(x_i+w_i)+y_iyl=(xiwi)yiyl=(x_i-w_i)-y_iyr=xi(yiwi)yr=x_i-(y_i-w_i),当前询问的答案可以用二维前缀和的方法表示为 g[xr][yr]g[xr][yl1]g[xl1][yr]+g[xl1][yl1]g[xr][yr]-g[xr][yl-1]-g[xl-1][yr]+g[xl-1][yl-1]

其中 xlxl 的最小值为 (min{xi}max{wi})+min{yi}1000(\min\{x_i\}-\max\{w_i\})+\min\{y_i\}\geq -1000ylyl 的最小值为 (min{xi}max{wi})max{yi}2000(\min\{x_i\}-\max\{w_i\})-\max\{y_i\}\geq -2000,可以给坐标中的斜行加上 10051005,斜列加上 20052005,来让坐标都大于 00,相当于平移。处理 DD 数组和计算 gg 数组时,下标也做同样的平移处理。

平移后 xrxr 的最大值为 $1005+(\max\{x_i\}+\max\{w_i\})+\max\{y_i\}\leq 4005$,yryr 的最大值为 $2005+\max\{x_i\}-(\min\{y_i\}-\max\{w_i\}))\leq 4005$,所以 DD 数组和 gg 数组的规模建议开到 4010×40104010\times 4010

时间复杂度 O((n+m+w)2+q)O((n+m+w)^2+q)

T6

20%

dp[i][j]dp[i][j] 表示从前 ii 种硬币中选出的总价值为 jj 的不同方案的数量。

用01背包的方法来转移:在 0i0\sim i 中枚举 kk 表示选了 kk 个第 ii 种硬币,如果 i×kji\times k\leq j 那么 dp[i][j]+=dp[i1][ji×k]dp[i][j]+=dp[i-1][j-i\times k]

注意过程中的取模和爆 int\text{int} 问题。

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

60%

对于第 ii 种硬币,如果 i×i>ni\times i>n,那么就不需要考虑这种硬币的数量限制了。

把硬币分为两类:前 n\sqrt{n} 种硬币称为小硬币,剩下的称为大硬币。其中大硬币是不需要考虑数量限制的。

对于小硬币,一共只有 n\sqrt{n} 种,kk 的枚举范围也不超过 n\sqrt{n},所以这部分的总时间复杂度为 O(n2)O(n^2)

对于大硬币,不需要考虑数量的限制可以视为数量无限,因此这部分可以用完全背包的方法来转移:dp[i][j]=dp[i1][j]+dp[i][ji]dp[i][j]=dp[i-1][j]+dp[i][j-i]。这部分的总时间复杂度也为 O(n2)O(n^2)

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

100%

先考虑小硬币:

  • f[i][j]f[i][j] 表示从前 ii 种硬币中选出的总价值为 jj 的不同方案的数量;
  • $f[i][j]=f[i-1][j]+f[i-1][j-i]+\dots+f[i-1][j-i\times i]$,注意到其中第二维的下标是一个等差数列 {j,ji,,ji×i}\{j,j-i,\dots,j-i\times i\}
  • 对于 ii,维护 s[j]=f[i1][j]+f[i1][ji]++f[i1][jmodi]s[j]=f[i-1][j]+f[i-1][j-i]+\dots+f[i-1][j\mod i],有 s[j]=f[i1][j]+s[ji]s[j]=f[i-1][j]+s[j-i]
  • 如果 (i+1)×i>j(i+1)\times i> j,也就是说总价值为 jj 时不可能用到超过 ii 个第 ii 种硬币,那么 f[i][j]=s[j]f[i][j]=s[j]
  • 否则 f[i][j]=s[j]s[j(i+1)×i]f[i][j]=s[j]-s[j-(i+1)\times i]

小硬币一共只有 n\sqrt{n} 种,所以这部分的总时间复杂度为 O(nn)O(n\sqrt{n})。空间复杂度可以用滚动数组的技巧降低到 O(n)O(n)

然后考虑大硬币:

  • g[i][j]g[i][j] 表示选中恰好 ii 个大硬币且总价值为 jj 的不同方案的数量;
  • 如果选中了至少一个价值最低的大硬币,也就是第 n+1\sqrt{n}+1 种硬币,那么剩下 i1i-1 个大硬币的总价值为 j(n+1)j-(\sqrt{n}+1)
  • 否则,选中的每个硬币价值都大于 n+1\sqrt{n}+1,那么方案数等于每个硬币价值都减一的方案数,也就是 ii 个大硬币且总价值为 jij-i
  • 因此 g[i][j]=g[i1][j(n+1)]+g[i][ji]g[i][j]=g[i-1][j-(\sqrt{n}+1)]+g[i][j-i]
  • 答案增加 g[i][j]×f[n][nj]g[i][j]\times f[\sqrt{n}][n-j],对应大硬币总价值为 jj,小硬币总价值为 njn-j 的方案。

单个大硬币价值至少为 n+1\sqrt{n}+1,因此选中的数量 ii 不可能超过 nn+1n\frac{n}{\sqrt{n}+1}\leq \sqrt{n},所以这部分的总时间复杂度也为 O(nn)O(n\sqrt{n})。空间复杂度可以用滚动数组的技巧降低到 O(n)O(n)

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

0 comments

No comments so far...