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
观察题目发现可以倒着来暴力减去后面的数求得答案,我们会发现这么做的复杂度最多为:
复杂度 \(O(\)能过\()\),足以通过本题。
jbgg想要n
用 \(w_{i}\) 表示 \(i\) 个 \(n\) 拼起来的数
显然存在 \(d\leqslant 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\) 的选法总数即为:
其中\(\binom{}{}\)为组合数符号,如:\(\binom{3}{2} = C_3^2\)
这种方法的复杂度为 \(O(n)\) 的。
回到题目,将数的二进制表示下的每一位拆开来单独考虑,会发现他们产生的贡献都是独立的。因此我们以同样的方法处理出各个位上异或和为 \(1\) 的选法总数,再乘上对应的权值加起来即可。
此复杂度为 \(O(n\log{m})\), \(m\) 为值域大小。因为二进制表示下能产生贡献的位数不超过 \(21\) 个,我们只需从第 \(1\) 位枚举到第 \(21\) 位计算贡献即可。
但如果再推一推,我们可以发现:
那么上面的式子可以变成:
我们会发现不需要再去统计二进制下各个位上 \(1\) 的个数了,只需要确认各个二进制位上有没有 \(1\) 出现即可。可以通过或操作来实现。
则答案可以为:
这个方法的复杂度为 \(O(n)\)。
yyjj与可恶的工图课
可以先将两盏灯投射到地面的阴影区间集合分别存起来,分别区间合并后,再分别处理出光亮区间集合存起来,再对两个光亮区间集合进行区间合并,再求具体长度就可以了。
具体的点的坐标可以运用初高中数学知识解决。
时间复杂度 \(O(nlogn)\)。