A. King of String Comparison 双指针
给定字符串和
,计算满足
字典序小于
的
的个数。
直接双指针扫一下,扫到满足的前缀就直接进行计数。否则直接跳下一个。
B. New Queries On Segment Deluxe 可持久化线段树
牛逼
建棵可持久化线段树,将区间覆盖操作视为节点接入空树再区间加的操作。思路比较简单,实现有点难。
C. Werewolves 树形背包
待补
F. to Pay Respects 模拟
你正在进行一场轮的游戏,在游戏中,
不会攻击你,但是会吟唱咒语。
在每轮游戏中,事件会按照以下顺序发生。
可以选择吟唱
Regeneration
咒语- 你可以选择吟唱
Poison
咒语 - 你可以用剑进行攻击,并造成
点伤害
- 所有负面效果生效
有三个属性,血条
、
Poison
效果叠加,
Regeneration
效果叠加。
每层Poison
效果可以产生伤害,如果有
Regeneration
效果就减去一层。每层Regeneration
效果可以产生回复。
现在你可以吟唱次法术,问对
造成的最大伤害。
思路.1
做法
讲Poison
对Regeneration
产生的削弱效果视为攻击产生的效果,记录在每个点施加Poison
产生的攻击的效果。然后直接排序取前大攻击效果累加进答案即可。复杂度来自排序
。
思路.2
做法
来自神犇队友。
首先将前个怪兽回血的点设为放技能的点。如果不足
次技能就从头开始补技能。
那么可以用一个双指针,然后将后面的技能往前移动,同时更新贡献取最大值。
由于不需要排序,双指针扫。
太妙了
G. Max Pair Matching 思维
题目要求对给定个
进行两两顶点配对形成
条边,边权的计算方式为
。要求边权和最大。
首先考虑拆绝对值号,不妨令(读入时进行预处理),在权值和最大的前提下,显然会有
个
产生负贡献,
个
产生正贡献。那么如何确定每个数对提供正贡献还是负贡献?
由于一定成立,我们任取两对进行分析。要使得
,显然需要
。那么我们只需要根据
的大小进行排序,然后取前
个
作为负贡献,取后
个
作为正贡献即可。
J. ABC Legacy 小模拟
首先,一定充当左括号,所以数量必不能超过
。然后剩余的问题在于
要充当的角色。
我们可以发现,要完成配对,需要个左括号和
个右括号。那么考虑选一部分
当左括号。显然对于左括号而言,根据贪心的思想越左越好,因此我们对于到补齐
个左括号范围内的
全部丢到队列里去,超出左括号的范围外的
当作右括号与
匹配掉。
然后对于一定充当右括号的,我们按照队列的顺序逐个匹配即可。匹配的同时可以检查合法性。
K. Amazing Tree
给定一颗个节点的树,可以从任意一个点开始
,求最小字典序的后续遍历。
首先,对于字典序最小的要求,我们一定是从叶结点中的最小值开始遍历的。我们可以记录每个节点的度,然后倒序寻找度为的节点。
然后,我们对当前节点进行讨论,我们有两种策略:
- 认为当前节点不是根节点:先将子树按最小权排序。如果发现当前子树中的最大最小值小于
,那么显然此时输出
不是最优策略,所以此时应当先
第
个子树(当作父节点向上走),再将
加入答案。否则就先遍历前
个子树,然后将
加入答案,再遍历最后一个子树;
- 认为当前节点是根节点:先将子树按最小权排序,然后按照最小叶序依次
子树,最后将
加入答案。
可以发现在时需要记录搜索的顺序,从而确定是否可以将子树作为父节点向上走。
L. Jason ABC
给定长度为由
构成的字符串,每次操作可以选择一段连续的区间将其全部修改为
中的一个字符。要求你在最小操作次数下将给定的字符串修改为包含
个
、
个
以及
个
的字符串。求最小修改次数以及修改操作。
首先可以确定,最大修改次数不会超过次:
首先我们预处理三个前缀分别表示到位置
为止三个字母的前缀和。
次:已经符合要求,不需要再修改
次:只需要修改一个区间
即可。如果假设将区间
变为
,那么要求
且
。那么直接双指针找即可。
次:找到最小的
,使得
中出现次数最多的字符恰出现了
次。那么把后面直接修改两次改为剩余两个字符的两段即可。
N. A-series 思维
有种,每种纸
的大小是第
张纸大小的两倍。
现在给你每种纸的数量,每次你可以选择一张纸对其进行对折,然后剪成两半。问能否通过剪操作变为目标纸张数量。
如果正着剪,显然会爆。那么不妨考虑倒序合并目标纸张。看够不够。