2022 zafu新生赛题解

打印煎饼(1x)

输出即可,可以直接 php。

代码链接

打印煎饼(2x)

原矩阵中的 \((i,j)\) ,对应新矩阵中的 \((2\times i,2\times j),(2\times i,2\times j+1),(2\times i+1,2\times j),(2\times i+1,2\times j+1)\)

所以我们将原矩阵中的每行的每个字符都输出两次,并且变成一样的两行就行,具体可结合代码进行理解。

代码链接

这个彬彬打电动超勇的

由于数据范围小,我们可以用数组记录每分钟是否在打游戏,查询时判断一下即可。

注意判断时要完整地读入数据,有许多代码都有提前 break 的问题。其次则是数组初始化。

代码链接

当然你也可以对每个时间点判断下是否在两个区间内。

代码链接

杨神の签到

从辗转相除法的角度考虑,会发现 \(a\)\(a + x\) 互质等价于 \(x\)\(a\) 互质。因此我们只需找到与 \(x\) 互质的数即可。

可以从 \(2\) 开始暴力找,因为 \(10^9\) 以内的数所含的不同质数不超过 \(10\) 个。

代码链接

当然你也可以直接输出 \(x + 1\)

杨神的命名法

按照题意模拟即可,如果用数组读入需注意数组大小。

代码链接

视力不好的yyjj

观察题目发现可以倒着来暴力减去后面的数求得答案,我们会发现这么做的复杂度最多为:

\[\lfloor \frac{10^5}{1} \rfloor + \lfloor \frac{10^5}{2} \rfloor + \cdots +\lfloor \frac{10^5}{10^5} \rfloor \ = 1166749 \leqslant 2 \times 10^6 \]

复杂度 \(O(\)能过\()\),足以通过本题。

代码链接

jbgg想要n

\(w_{i}\) 表示 \(i\)\(n\) 拼起来的数

显然存在 \(d\leqslant p\),使得

\[w_{d} \bmod p = w_{0} =0 \]

易知

\[w_{i+j}=w_{i}\times d + w_{j} \]

可得

\[w_{d+j}\%p=w_{j}\%p \]

因此 \(w_{i}\%p\) 会循环且循环节的长度为 \(d\),又因为 \(d\leqslant p\),我们只要直接计算出所有 \(1\leqslant i \leqslant \min\left(m,p\right)\) 时的 \(w_{i}\% p\),取其中的最大值作为答案就行了。

时间复杂度为 \(O(p)\)

代码链接

车车的爱之矩阵

以下是一种可行的解法:

考虑只用 \(1\)\(-1\) 构造这个矩阵,容易想到 \(1\)\(-1\) 间隔排的情况正好能够满足条件。(类似于国际象棋的单元格)

代码链接

汽车人变形

前置知识:dfs,图

由于车车不会回头,答案就是寻找一条链,使得链上的人数最大。

我们可以枚举每一个点作为 dfs 的根节点对整张图进行 dfs,在 dfs 的过程中记录车车创到的人数,对答案取 \(\max\) 即可。此方法复杂度为 \(O(n^2)\),可以通过本题。

代码链接

当然本题还有复杂度为 \(O(n)\) 的经典 树形dp 做法。

代码链接

磊神的慈悲

按照题意直接模拟即可,一种具体实现如下,复杂度为 \(O(n^2)\)

代码链接

当然你也可以使用并查集路径路径压缩来将查找复杂度优化到近似 \(O(1)\)

复杂度的具体分析可以参考 oi-wiki 并查集复杂度

代码链接

jbgg爆金币咯

一道很基础的博弈,当 \(AsindE\) 放技能时,如果至少有一个技能能让他达到 \(slwang\) 的必败态,那么这个位置就是 \(AsindE\) 必胜态,反之就是他的必败态,\(slwang\) 放技能也是一样的

由于 \(jbgg\) 的血量只会减少,且当 \(jbgg\) 血量小于等于 \(0\) 时对双方来说都是必败态,我们可以根据 \(boss\) 剩余血量从低向高转移,最后只要看当 \(jbgg\) 血量为 \(x\)\(AsindE\) 是否必胜就好了。

每次求得答案的时间复杂度为 \(O(x \times (n+m))\)

代码链接

当然你也可以使用记忆化搜索

代码链接

异或和

相关知识:组合数,快速幂,乘法逆元。

首先暴力的复杂度为 \(O(2^{n})\) 显然无法通过。

考虑序列中只有 \(0\)\(1\) 的情况。此时只有当我们选择的数中有奇数个 \(1\) 的时候,它们的异或和才为 \(1\),对答案产生贡献。那么此时的答案就是:所有下标的选法中,含有奇数个 \(1\) 的选法的个数

假设长度为 \(n\) 的序列中有 \(x\)\(1\),那么异或和为 \(1\) 的选法总数即为:

\[2^{n - x} \times\displaystyle\sum_{i=1}^{\lfloor \frac{x + 1}{2} \rfloor}\binom{x}{2\times i - 1} \]

其中\(\binom{}{}\)为组合数符号,如:\(\binom{3}{2} = C_3^2\)

这种方法的复杂度为 \(O(n)\) 的。

回到题目,将数的二进制表示下的每一位拆开来单独考虑,会发现他们产生的贡献都是独立的。因此我们以同样的方法处理出各个位上异或和为 \(1\) 的选法总数,再乘上对应的权值加起来即可。

此复杂度为 \(O(n\log{m})\), \(m\) 为值域大小。因为二进制表示下能产生贡献的位数不超过 \(21\) 个,我们只需从第 \(1\) 位枚举到第 \(21\) 位计算贡献即可。

代码链接

但如果再推一推,我们可以发现:

\[\displaystyle\sum_{i=1}^{\lfloor \frac{x + 1}{2} \rfloor}\binom{x}{2\times i - 1}=2^{x-1} \]

那么上面的式子可以变成:

\[2^{n-x} \times 2^{x - 1} = 2^{n-1} \]

我们会发现不需要再去统计二进制下各个位上 \(1\) 的个数了,只需要确认各个二进制位上有没有 \(1\) 出现即可。可以通过或操作来实现。

则答案可以为:

\[(a_1 | a_2 | \cdots |a_n) \times 2^{n-1} \]

这个方法的复杂度为 \(O(n)\)

代码链接

yyjj与可恶的工图课

可以先将两盏灯投射到地面的阴影区间集合分别存起来,分别区间合并后,再分别处理出光亮区间集合存起来,再对两个光亮区间集合进行区间合并,再求具体长度就可以了。

具体的点的坐标可以运用初高中数学知识解决。

时间复杂度 \(O(nlogn)\)

代码链接

posted @ 2022-12-11 15:49  AsindE  阅读(987)  评论(0编辑  收藏  举报