2022牛客冬令营 第二场 题解
A题 小沙的炉石(数学,思维)
现在我们有 张攻击牌和 张回蓝牌。攻击牌消耗一格蓝量,并且对对方造成 1 点普通伤害和附带的法伤。回蓝牌则回复一格蓝量(蓝量无上限)。
此外,我们每使用一张牌之后,可以使得我们的法力伤害值增加 1,可叠加(初始值为 0)。
现在有 次询问,每次给定敌方血量 ,问我们能否找到一个出牌顺序,使得地方能够恰好被我们斩杀(不要求用完牌)。
,看不懂法伤那部分可以看样例。
我们不难找到伤害最大化的方法并计算出来:前面疯狂堆回复牌,然后后面能打多少进攻牌就打多少,值的话就直接等差数列套个公式就行。
接下来,我们看看我们可以构造出哪些攻击方式。
在进行 次攻击的情况下,我们至少可以造成 的伤害(1010101这种方式),至多造成 的伤害。值得注意的是,这是连续的(临项交换法,将攻击牌往后面交换位置)。
不过显然,我们不能每次一个个求出来区间,然后每次询问的时候都去遍历一遍,那么我们只能看看这些区间能不能合并(显然是可以的)
实践发现,仅存在 和 两种情况是特例(可以自己草稿纸上面推,也可以写个暴力直接莽),其余情况下直接看在不在 里面即可。
B题 小沙的魔法(排序,离散化,图上遍历)
给定一个 个点的图,每个点有一个权值 。现在我们每次可以进行一次操作,使得某个点的权值下降 1,我们的目标是使得所有点的权值变为 0。
不过,单纯这样操作有点慢,所以我们还有 个连接器,每个连接器可以将两个点进行连接,之后每次操作可以视为对整个连通块进行一次操作。连接器至多使用 次。
(至多 次连接就可以使得整个图联通,所以连接器的次数限制无意义。)
这题其实和著名的 P1969 [NOIP2013 提高组] 积木大赛 很类似,不过那题是线性,本题搬到了图上面。
先排个序,然后离散化一下,从大到小依次处理。我勉强看得懂题解代码和思路,但有一说一,自己真写不出来。
C题 小沙的杀球(贪心)
小沙特别喜欢杀球(羽毛球的一个玩法),但是水平有限,只能杀后场的高远球,杀不了前场的小球。
小沙是有体力限制的,每杀一个球就会消耗 体力,但是不杀球的话则会回复 体力。体力没有上限,但是体力不可能为负。
现在小沙有体力 ,现在即将有 个球打过来,并且知道他们分别是哪种球(按顺序),试求出小沙究竟最多能杀多少球?
按照贪心,尽可能的来杀高远球,如果体力不够或者是小球就休息一下,恢复体力。
这题会卡 int,所以记得开 long long。
D题 小沙的涂色(unsolved)
小思维
细节
中模拟
构造
有许多种构造思路,这里列举出一种
如果边长是3的倍数我们便无法构造出合法方案。因为我们需要填色的格子数一定是3的倍数,所以要满足
对于边长mod 3情况下是1的情况,我们可以选择试边界向内缩小6格的方案使他一直维持 mod 3 为 1,最后只剩一个格子停下即可,对于边长 mod 3 为 2 的情况,我们需要让他变成 1,所以我们可以选择向内缩小 4格的方案,从外向内染色。
也可以使用二分的方法染色,解法很多,只要你觉得好写~
时间复杂度
E题 小沙的长路(图论推理)
给定一个 个点的完全图,现在我们可以任意给这些边加方向,问加上之后这个图的最长路的可能的最小值和最大值。
-
最大值
当 为奇数的时候,直接把图当成一个无向图来走欧拉通路即可(每个点的度都是 ,偶数,所以存在欧拉通路),然后按照路径来标边的方向,值为 。
当 为偶数的时候,所有点的度数都是奇数,不存在欧拉通路。如果我们将最长路之外的边删掉,意味着这条最长路就是剩下的边所组成的图的欧拉通路。那显然,删掉 条边的时候,可以将 个点的度数减去一(变成偶数),再留下两个奇数点,满足构成欧拉回路的条件,所以答案为 (也是删边最少的方案)
-
最小值
我们逐个添加点,发现每添加一个点,最长路径至少增加 1(可以根据每个点的入度出度来判断)。
由数学归纳法可知,最小值为 。
F题 小沙的算数 (模拟,逆元)
现在有一个长度为 ,仅含加号和乘号的表达式,每个位置上面有一个初始值。
现在,有 次询问,每次询问会要求将位置 上面的数改成 ,然后计算一下表达式的值并且输出。
,答案对 取模且题目中给出的所有数值都在 范围内。
仅包含加号和乘号,那我们可以将不同位置的数,打上不同的标记(相同标记表示在一个连通块内),一个连通块的值等于等于该标记的值的乘积,表达式的值等于所有连通块之和。
对于每次询问,我们找到位置 对应的连通块,然后就是一连串的先除再乘,顺便更新答案即可。因为取模的原因,所以还要写下逆元啥的。
G题 小沙的身法(LCA)
给定一个有 个点的联通树,每个点有一个高度 。
我们可以沿着树上面的边移动,从 跳到 ,需要花费 的体力(从高处往低处跳不需要体力,反之则需要耗费高度差的体力)。
现在有 次询问,每次询问给定起点和终点,我们从地上跳到起点,然后一路跳到终点后跳回地上,问需要耗费的体力是多少?(地面可以视为高度为 0,但是只有开头和结束可以跳)
树上路径,多次查询,那显然就是倍增 LCA了。
考虑到具有方向性,所以我们需要构建两颗树,均以 1 为根,然后一个按照从深度低往深度高的方式赋边权,另一棵树反过来,然后每次询问的时候分别查询即可。
H题 小沙的数数(数学)
已知一个长度为 的非负整数数列 ,数值和为 。
现在我们想要让数列的异或和最大,尝试找出有几种方案。
,方案数对 取模。
不是很好证明,异或和的最大值就是 :感性上讲,就是讲 的二进制上面的 1,被均匀分配到 个坐标的不同位置上面,能够使得异或和最大。而任何尝试使异或值变得更大的方式,都会使得数值和超过 。
分配方式很奇妙:我们记 在二进制下有 个 1,那么每个位置的 1 都有 个选择,所以答案是 。
的规模比较离谱,所以一开始就得取个模,不然直接炸 long long。
I题 小沙的构造(模拟,构造)
直接看代码,别问咋构造的,我 WA 了 12 发才过就离谱。
J题 小沙的Dota(unsolved)
DDP(所需知识点线段树)
考虑转移方程
在需要修改的情况下,我们可以采用线段树维护带修改的 DP 过程。
对于节点维护左状态为 V 的情况下变化到 X 所需要的最小代价,预处理各个状态之间的代价转移即可
时间复杂度:
的合并写丑了可能会被卡。
K题 小沙的步伐 (签到)
除了在 5 上面不用动,别的地方直接都是目标位置和 5 都加 1。
L/M题 小沙的remake(DP,树状数组,排序)
不难写出一个 的 DP:
这题是最长上升子序列的一种变形(从最长变成了求方案数,同时加上了范围限制),以前是可以通过树状数组+离散化来优化复杂度,但是对这题似乎不太够。
这题比较特殊,求方案数,所以我们在传统下标上面建立树状数组(用来求和),但是遍历DP的时候按照排序过后的下标来,这样恰好满足了:
- 可以限定下标范围(显然的,就相当于上面那个朴素DP的优化)
- 根据按照数值排序后的下标顺序来进行状态转移,保证了每次查询之后的值都是合法的,可以直接求和
__EOF__

本文链接:https://www.cnblogs.com/cyhforlight/p/15861925.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2021-02-03 2021牛客寒假算法基础集训营1 解题补题报告