T1

100%

用循环语句完成 AiA_i 的输入,在输入的同时用 %2\%2 操作判断是否是奇数,如果是奇数就更新答案。

注意判断 AiA_i 中未出现奇数的情况。

T2

100%

首先当 n×mn\times m 是奇数时,无法恰好覆盖,证明如下:

1×21\times 2 的砖块面积为 22,所以覆盖的总面积也一定是 22 的整数倍,也就是说覆盖的面积只能是偶数不能是奇数。

n×mn\times m 是偶数时,存在恰好覆盖的方案,以下是其中一种方案:

因为 n×mn\times m 是偶数,所以 nnmm 中至少有一个是偶数。

nn 是偶数,我们把砖块竖着放置,每行 mm 块,放 n2\frac{n}{2} 行,如下方左图。

mm 是偶数,我们把砖块横着放置,每行 m2\frac{m}{2} 块,放 nn 行,如下方右图。

p1

所以直接判断 n×mn\times m 的奇偶性即可。

T3

30%

先用两重循环枚举区间的左端点 ll 和右端点 rr,再用一重循环进行区间内 AiA_i 的求和。

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

60%

预处理 AiA_i 的前缀和 sum[i]=j=1iAj=A1+A2++Aisum[i] = \sum_{j=1}^i A_j = A_1 + A_2+……+A_i

用两重循环枚举区间的左端点 ll 和右端点 rr,用 sum[r]sum[l1]sum[r]-sum[l-1]O(1)O(1) 求出区间和。

注意最终答案可能会爆 int\text{int}

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

100%

贡献的角度:考虑 AiA_i 在哪些区间里会对答案分别产生什么样的影响。

如果区间包含 ii,那么会让答案增加 AiA_i。即贡献为 lirl\leq i \leq r 的区间的数量,乘上 AiA_i

此时 llrr 的取值范围是独立的, ll 的取值范围为 1i1\sim irr 的取值范围为 ini\sim n,所以这样的区间共有 i×(ni+1)i\times (n-i+1) 个。

所以最终答案为 i=1nAi×i×(ni+1)\sum_{i=1}^n A_i\times i\times (n-i+1)。注意不仅最终答案会爆 int\text{int},过程中也可能爆 int\text{int}

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

T4

30%

对于测试点#3~5,按照题目所说,对每个询问,模拟过程中的位置变化即可。

cic_i 最大值为 C=max{ci}C=\max\{c_i\}

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

50%

对于测试点#1~2,可以用 f[i][j]f[i][j] 维护从 ii 出发, jj 秒之后所在的位置。转移式为 f[i][j]=f[f[i][j1]][1]f[i][j]=f[f[i][j-1]][1]

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

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

时间复杂度 O(min(qC,nC))O(\min(qC, nC))

100%

按照倍增的思路,用 f[i][j]f[i][j] 维护从 ii 出发, 2j2^j 秒之后所在的位置。转移式为 f[i][j]=f[f[i][j1]][j1]f[i][j]=f[f[i][j-1]][j-1]

用倍增的思路,将每个询问分解为若干个时间长度为 22 的幂的步骤(比如 21=20+22+2421=2^0+2^2+2^4),通过之前维护的 ff 数组模拟每个步骤的位置变化。

时间复杂度 O(nlog(C)+qlog(C))O(n\log (C)+q\log(C))

T5

20%

用两重循环枚举区间的左端点 ll 和右端点 rr,对区间内的元素进行排序,如果第 kk 小的元素大于等于 xx 那么最终答案增加 11

时间复杂度 O(n3log(n))O(n^3\log(n))

50%

“区间内第 kk 小的元素大于等于 xx ”可以转化为“区间内小于 xx 的元素少于 kk 个”。

sum[i]sum[i] 维护前缀 [1,i][1,i] 中小于 xx 的元素的个数。

用两重循环枚举区间的左端点 ll 和右端点 rr,用 sum[r]sum[l1]sum[r]-sum[l-1] 求出区间内小于 xx 的元素的个数,如果少于 kk 个那么最终答案增加 11

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

100%

  • 方法1:

对于同一个左端点 ll,区间内小于 xx 的元素的个数是随着右端点 rr 的增大而递增的。

因此对于每个 ll,我们可以用二分右端点 rr,用上述方法进行check,找出最大的 rr 满足 [l,r][l,r] 是过分子的区间,即对于左端点 ll,右端点取 [l,r][l,r] 时都是过分的子区间,答案增加 rl+1r-l+1

时间复杂度 O(nlog(n))O(n\log(n))

  • 方法2:

不难发现这个满足条件的最大的右端点 rr,也是随着左端点 ll 的增大而递增的,因此我们可以用双指针的思路来求出每个 ll 对应的最大的 rr

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

  • 方法3:

预处理第 ii 个满足 A[j]<xA[j]<x 的位置 pos[i]pos[i],枚举 pos[i]pos[i] 作为区间内第一个小于 xx 的元素所在位置,那么对应的过分子区间的左端点取值范围为 [pos[i1]+1,pos[i]][pos[i-1]+1,pos[i]],右端点的取值范围为 [pos[i],pos[i+k]1][pos[i],pos[i+k]-1]

另外还有一类过分的子区间是不包含小于 xx 的元素的,枚举左端点 ll,设 ll 右侧最近的小于 xx 的元素位置为 gg,那么右端点的取值范围为 [l,g1][l,g-1]

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

T6

20%

对于测试点#1~2,因为 m=10m=10 所以可以直接从 nn00nn99 枚举答案,枚举后再统计每一种数字的出现次数,判断是否满足出现次数都不超过 kk 的限制。

时间复杂度 O(mnn)O(m^nn)

30%

对于测试点#1~3,可以用 DFS\text{DFS} 或其他方法,从 nn00nnm1m-1 枚举答案,枚举的同时统计每种数字的出现次数。如果用 DFS\text{DFS} 来实现,前缀不满足条件时还可以直接剪枝。

时间复杂度 O(mn)O(m^n)

40%

对于测试点#1测试点#4,因为 k=nk=n 所以答案就是 mnm^n。注意最终答案可能会爆 int\text{int},要取模。

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

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

100%

将问题转化为在 nn 个空位分别填入 0m10\sim m-1mm 种数字。用 dp[i][j]dp[i][j] 表示用前 ii 种数字(即 0i10\sim i-1 )填了 jj 个位置的方案。

考虑前 i1i-1 种数字已经填了 jj 个位置,在剩下的 njn-j 个位置中再选 pp 个位置填第 ii 种数字,那么转移方程为 dp[i][j+p]+=dp[i1][j]×(njp)dp[i][j+p]+=dp[i-1][j]\times \binom {n-j} {p}

另一种思路是考虑前 ii 种数字填 jj 个位置,其中第 ii 种数字占 pp 个位置,那么转移方程为 $dp[i][j]=\sum_{p=0}^{k} dp[i-1][j-p]\times \binom {n-(j-p)} {p}$。

组合数可以用杨辉三角法预处理。注意过程中的取模和爆 int\text{int} 问题。

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

0 comments

No comments so far...