夏令营7.29总结
题目
T1
采用预计算$+$哈希映射的策略,提前处理可能的平方数,再通过查询快速返回结果:
- 预计算阶段:生成数据范围内的平方数,统计其各位数字的出现次数,并考虑添加不同数量的0后的数字组成,存储到映射中(确保记录最小的平方数)。
- 查询阶段:对于输入数字,统计其数字组成,直接到映射中查找是否存在匹配的记录,返回对应的最小平方数或
-1
。
查询:
处理输入:对于每个测试用例,读取数字
n
,统计其各位数字的出现次数(同样用向量now
记录)。映射查询:直接用统计得到的
now
作为键,到map
中查找:
- 若存在对应的记录,输出该平方数。
- 若不存在,输出
-1
。
T2
- 用
last
记录上一个1出现的位置(初始为0,表示尚未遇到1)。 - 遍历字符串,当遇到1时:
- 若这是第一个1,则初始化结果
ans=1
,并更新last
为当前位置。 - 若不是第一个1,则计算当前位置与
last
的间隔(i-last+1
),将结果累乘到ans
中,并更新last
为当前位置。
- 若这是第一个1,则初始化结果
- 最终输出
ans
(若字符串中没有1,则ans
保持初始值0)。
T3
众所周知,对于固定和的两个数,它们的乘积在两数尽可能接近时最大(例如,周长固定的矩形中,正方形面积最大)。基于此,代码结合二进制特性(2的幂)来快速拆分n
:
- 找到最大的2的幂:对于
n
,找到小于等于n
的最大2的幂,记为$cnt=2^lg$(其中$lg=log2(n)$,即cnt
是n
范围内最大的二进制整次幂,如$n=5$时$cnt=4$)。 - 比较两种拆分方案:
- 方案 1:$a=cnt,b=n-cnt$(将
n
拆分为最大2的幂和剩余部分)。 - 方案 2:$a=cnt/2,b=(cnt/2)-1$(将最大 2 的幂拆分为两个最接近的数,此时$a+b=cnt-1$,若$n\ge cnt-1$,则剩余部分不影响最优解)。
- 方案 1:$a=cnt,b=n-cnt$(将
- 选择最优方案:通过比较两种方案的乘积大小(简化为比较$2\times(n-cnt)$与$(cnt/2)-1$的大小),选择乘积更大的拆分方式。
T4
代码通过线段树维护区间的 “有效计数”,结合元素出现位置的追踪,动态更新计数并求解最大值:
- 追踪元素出现位置:用$last[x]$记录元素 $x$上一次出现的位置,$last2[x]$ 记录元素$x$上上次出现的位置。
- 区间更新策略:当遍历到位置$r$时(当前子区间的右端点):
- 对$[last[a[r]]+1,r]$区间加1:表示包含当前元素$a[r]$的子区间计数增加。
- 对$[last2[a[r]]+1,last[a[r]]]$区间减1:表示若子区间包含$a[r]$的上一次出现位置,但不包含上上次出现位置,则该子区间中$a[r]$出现次数已达3次,计数减少。
- 维护最大值:线段树的根节点存储当前所有有效子区间的最大计数(即最长长度),遍历过程中实时更新答案。
T5
思路
- 计算初始值:
- 第一组的初始总和$sum$(全部选择$a[i]$时的总和)。
- 第二组的最小总和$minn$(全部选择$min(c, d)$ 时的总和)和最大总和$maxx$(全部选择$max(c,d)$时的总和)。
- 枚举第一组的所有可能总和:
- 用集合$st$存储第一组所有可能的总和。初始时$st$只包含初始总和$sum$。
- 对于每个元素$i$,通过加入调整量$b[i]-a[i]$,扩展$st$中的可能总和(即每个现有总和都可以选择加上该调整量,对应选择
b[i]
而非a[i]
)。
- 计算最优解:
- 对于$st$中的每个可能总和$i$,计算它与第二组范围$[minn, maxx]$的 “最大距离”:
- 若
i
在[minn, maxx]
内,最大距离为0
(完全匹配)。 - 若
i < minn
,最大距离为minn - i
。 - 若
i > maxx
,最大距离为i - maxx
。
- 若
- 取所有最大距离中的最小值作为答案。
- 对于$st$中的每个可能总和$i$,计算它与第二组范围$[minn, maxx]$的 “最大距离”:
时间有限,写的比较简陋
夏令营7.29总结
https://joshua0729.github.io/2025/07/29/夏令营7-29总结/