本来前面还有一点内容的,但是今天手残把文件从U盘里误删了,费了好大功夫恢复出来的时候发现前面一点内容已经被一段不知名且缺胳膊少腿的代码覆盖了,所以就只能这样了。这启发我没事多备份备份以防悲剧发生。
从 CF 上选了五十个贪心题,然后发现自己贪心的基本素养实在是太差了,比较悲伤。
可以推广到许多函数上。所以可以二分斜率,假设为 ,那么把所有斜率大于 的点拿进来算代价,然后根据这个来移动左右指针,大概的思想是考虑两个位置选择的数量相同时如何调整分配。最后剩余部分用得到的斜率去做即可,有点细节。
为什么评分那么高呢。看样例猜想答案只可能是 或者 ,暴力验证就可以了。证明上考虑首尾相接成一个环,一定存在一段使得 的个数为给定值,因为由于题目给定的限制不可能都是正的或者都是负的,而这玩意的变化是连续的,所以一定存在,但是这段可能被边界割开所以就有了 的情况。
不会后缀排序怎么办。更准确地来说这道题用了后缀排序中倍增排序的思想,你会发现对于基准为 的排序可以分成两个子问题,即使得 和 拼起来,其内部顺序在之前已经处理好了不用管,我们要做的就是找到最优的字典序最小的二元组,暴力排序就可以做到 。更加书面地表达是我们进行 轮排序,每次用 表示以 为基准排序后前 个字母最小的情况下在所有位置中的排名,下一轮借用这个值继续排序就可以了。
为什么呢。显然答案一定包含一个全局最大值,所以考虑枚举另一个顶点在哪里然后考虑 check。如果单纯来的话发现可能需要考虑 种情况非常难受,此时需要用 表示一个点在第一个或者第二个序列中时另一个序列结尾的最值,然后就可以方便转移了,复杂度甚至的线性的。这种思路在把整个序列分成两个单调序列时很有用。但是感觉有些地方稍微有点绕,我是蛤蟆。
算是做出来的。按照 排序,对于每个值贪心地取最小的,判断上可以用 CDQZ 联考一样的方法容斥哈希去做,大概可以做到一些 。但是还有一个比较巧妙的点在于可以按 从小到大考虑,如果当前的决策点比上一次更靠右的话那么本轮是无效的,所以决策点具有单调性,借助 unordered_map 可以做到线性。
为什么呢。感觉有种说不出来的奇怪。枚举二者重合的区域,然后发现有效的区域只有 种,对于每种进行一次 的判定即可。感觉考的更多的是基本素养。可以这么认为。
水一个题。发现就是一个裸的背包问题,懒得写了。
太愚蠢了。考虑整个滑雪的过程,由于初始的机械能(也就是势能)是确定的,而且观察图发现一定存在一条路线使得势能可以完全转化成动能,所以我们要做的就是找个地方尽量消耗这些动能,显然这个地方应该尽量低,记为 ,那么一个点的答案应该是 。可以消耗动能的地方应该是个类似于平台的位置,而分析得到高度不同的平台数量不会太多(因为一个平台意味着两条不短的不交链的存在),所以可以对于每个高度求出哪些点可以合法地滑到这个地方,可以跑一个类似于最短路的东西,用 表示要从 到当前平台所需要的最少势能,分层用队列转移即可做到线性(是不是线性其实我不会分析,反正能过)。
当时打表已经得到了结论,即最后数列中的元素就是不小于 的 的整次数幂,但是构造的时候出了大问题,一开始想的是进行 轮,每轮通过一些操作使得每个数都是 的倍数,但是这样会在 的时候寄掉,想了一些奇怪的方法优化但是都没有什么结果。题解确实很巧妙,考虑尽量凑一些 ,那么会剩下两个部分,一个是小的未使用的数,一个是使用过的留下来的数,二者都构成了子问题,于是可以递归解决,但是感觉写起来像被撅了一样。多头给了一个很好的写法是说每次找最大的数,然后尝试凑整次数幂,这样也可以解决问题。要好写不少。
太愚蠢了,一开始纠结于初始的两个叶子的确定问题,结果方向压根就是错的。只需要更加形式地描述限制即可,以最大值为根,那么对于非根的点限制等价于子树内有不小于自己的叶子,而根的限制等价于子树内有至少两个不小于自己的叶子。非根的转移是容易的,如果孩子中已经有合法的叶子那自然很好,如果没有就考虑钦定一个叶子到自己的权值,显然钦定最大的那个孩子即可,所以维护 表示子树内最大的叶子就可以了。根同时维护次大即可。
炸鱼。黑白染色然后顺着染色即可。
说不定是可以想出来的,但是今晚时间实在不够了。钦定一个顺序,考虑让一对数在 更大的地方产生贡献,思考这样是否有什么性质。发现只有两边第一个比自己 小的位置才可能产生贡献,简单分析一下大小关系就能证明,于是离线排序树状数组维护即可,这不是和那个 U R wrong 场的重题一个路数吗。
很牛逼,但是我不想写了。遂摆了。
板子题。就考虑割开某条线所需要的代价,显然就是跨这根线的骨牌数量。由于所有中心对称的线都过正方形的中点,所以只需要每条线的代价算上对称点的代价后从中心点向边界点跑最短路即可。
事实证明我完全不会贪心。就有的时候贪心就是钦定一个顺序,由于当前的点只能在当前阶段选择,所以我们只需要在满足当前阶段合法的前提下尽量利好后面的阶段,经典的区间点覆盖贪心就是这样的。具体到这道题,阶段就是一条一条的左斜线,如果当前阶段不解决问题后面就无法解决了,所以只能一步步走下去;如果当前没有点了就可以考虑右拐了,然后贪心地解决后面阶段的问题即可。用 set 维护点的集合就好啦。
感觉还是很综合的一个题,我写了 6k 因为我是蛤蟆。建图,每个沙子向可以导致其掉落的沙子连边,稍微优化一下就能做到 的边数。然后缩点,一个选择的沙子集合合法等价于选择的强连通分量可以通往所有包含恰好第 个沙子的强连通分量。去除那些无用的(可以被选中沙子到达的选中沙子)的强连通分量之后呢,发现每个点可以到达的选中沙子是一个区间,证明上考虑从扰动沙子的连续性思考。于是问题变成了给定一些区间,希望选出最少的区间覆盖整个数轴,按左端点排序之后贪心维护右端点的位置就可以了。
你好。观察到我们希望一些点尽量地在同一列,于是用 表示所有完全包含在 中的区间能产生的最大贡献是多少。转椅上枚举中间点,然后找有哪些区间跨这个点,设数量为 ,那么此时的答案就是 ,随便优化一下就能做到 的复杂度。有些贪心需要大胆猜想,比如这道题。
你好。不大不小的分类讨论题目。乘号和加号不同时出现的情况显然是平凡的,忽略掉。如果乘号和加号同时存在,那么显然会使用这两个符号。以零为界分段之后呢对于每一段进行考量,发现如果不存在 的话直接用乘号连接所有数就可以了,但是 的存在使得结论可能不成立。分析发现结论不成立的原因在于一堆 和某个数乘起来的结果还没有这堆 加起来的贡献大,而如若答案足够大,那么 把两边分开一定不优,所以只需要把除了两边的其它位置全部填上乘号即可;如果答案不够大,那么说明非 的数不够多,暴力 DP 即可。
隔座送钩春酒暖,分曹射覆蜡灯红。这就是前两天 ygg 让做的一个 T2,只不过那道题是搜索题这道题可能要用一点 DP。说回来,直接状压可以做到比较好的复杂度,然后贪心发现只需要取最前面一些数就可以做到最优解,所以复杂度就降到了一个可以接受的水平。
你需要有一定的观察力。对于一段长度为 的区间,如果指定其分成 段,那么一定会分出来 和 的一些段,而二者其实都是可以二分的。也就是说假如我们当前希望分出来的那些段中最大值不超过 ,最小值不超过 ,那么等价于对于每一段来说 ,反过来描述限制就是 。发现二者的限制是独立的,所以可以二分得到一个可能不合法的粗略边界 。如果 ,那么可以构造出一组答案为 的方案;如果 ,那么可能存在一些段无法被正确划分的情况,也就是 ,由于分子相同分母左小右大,只可能是右边比左边恰好大 ,只需要一边退让一个就可以了。问题转化成了有一些形如 的条件,排序即可。
你需要有更强的观察力,联考也考到了,也算是心有灵犀一点通了。问题变成了希望构造一些集合 使得不存在两个集合使得其中一个是另一个的子集。画图发现这是一个最长反链问题,转成最小链覆盖之后发现中间最宽的地方是无法优化的,所以答案应当就是 。分析发现可重集也应当沿用这个结论。最后就是方案统计,暴力地直接分治加上 NTT 是可以通过的,而且跑得比较快。复杂度不明。
不完全做出来的。显然每轮产生贡献的位置是单调不降的,而且每轮的贡献很有可能和上一轮是一样的。然后需要做的就是用更加明晰的方式去描述这件事情,于是令 表示第 轮贡献位置为 并且用掉了 次机会的最大收益,考虑当前这一轮显然只有两种决策,一种是沿用上一次的贡献,这样会消耗一次机会;一种是从后面再找一个拎到当前位置来,会消耗距离次机会,列出方程发现可以简单地优化,复杂度是 的。
结论大师。对于 的情况显然直接一个升序的序列是最优的而且字典序最小;对于 的情况画图可知倒序的序列是一个数值上的最优解,于是有了 的做法,具体就是每次从小往大填,每次检查后半部分贪心填的情况下是否可以达到最优解;优化上考虑什么样是合法的,分析画图发现等价于不应该存在两个相邻的数落差大于给定的 ,否则在固定的 的基础上再多出一些代价显然不优,于是用 set 维护这个东西,每次找到合法(即删掉这个数之后两边的数不会因此变得落差过大)的最小的数,用链表维护修改即可。
诈骗大师,当时看了一下,什么 Div1+2 的 G2,还是个 分黑题,完全不像是自己能想出来的。结果是个傻逼题。蛤蟆。如果取消所有限制的话只需要对比每个方案的性价比然后贪心地从高到低取就可以了,这启发我们可以拆贡献;如果加上一个最多选 个的限制的话等价于每个方案最多只能取 次,做一次多重背包就可以了;如果再加上一个和恰好为 的限制,那么按照上面的方式选出来的答案可能不合法,所以提出来一次用于保证合法,然后每个方案按照 的上界做背包就可以了。二进制拆分就可以了,跑得飞快。
终于遇到一个简单题了,你需要做的就是分析重心的一些性质。显然答案是一条边两边子树大小差的绝对值,这条边自然是连接树的重心和另一个点的。所以我们需要做的就是动态地维护重心的位置以及这个重心重儿子的大小,这是简单的,因为大多数时候重心并不会发生变化,如果发生变化重心只会朝着添加节点的方向移动一条边并且之前的重心一定是重儿子。于是用树状数组维护子树和就可以啦。
论洛谷的评分系统有多混乱。无解情况大概是容易的,考虑如何构造有解的情况。等价于每个位置被选中的次数都是奇数,所以初始地给每个位置一次选择的机会,然后顺次调整每个位置两次直到总和是 的倍数并且最大的数不超过理论取的次数。猜想这样的最优解,然后就可以通过这道题了。
还好。大概就是说看到这种图上的构造题就往 dfs 树的方向去想。由于两个任务总有一个可以完成,而第一个任务等价于找到的树深度不小于 ,所以只需要思考在树高比较小的情况下如何完成任务二。由于不存在横叉边,尽量把同高度的节点匹配起来总是没有问题的,而每一层至多遗留一个节点,把他们匹配起来就可以了,分析发现这大概是正确的。
有的时候应该勇于分治。正解自然是妙的,但是感觉下面那种方法更具有拓展性。显然令 表示左端点是 时最大的合法右端点,而序列 是不降的,对这个序列进行分治即可。复杂度没啥保证但大多数时候就是卡不掉。
还好。如果每条边的方向都已经确定了的话那么答案是每个点所在链的数量之和,也就是 的和。而如果两个节点的权值不同那么边的方向是确定了的,只需要思考相同权值的点之间的方向,到这一步有显然的转移,令 表示节点 所在的子树中父亲和自己的边方向确定的情况下最小的代价,转移是简单的。
要会猜结论。一个直观上的结论是说我们希望每层的颜色都一样,这样可以达到答案的下界,即 。另外还有一个比较巧妙的结论,即我们总有方法构造出一种 的染色方案,证明是说假设当前有 个白色机会和 个黑色机会,当前这层有 个节点。如果 ,那么直接染色就可以了;如果 ,因为 ,也就是说可以用的颜色是超过一半的,而当前节点的非叶子节点显然是不超过一半的,于是把非叶子和一些叶子染成多的那个就可以达到上面说的答案上界。于是只需要判断是否能达到下界即可,大力多重背包记录方案并输出就可以啦。
思考朴素的最长公共子序列应该怎么求,大概就是记 表示第一个串匹配到 第二个串匹配到 的最大长度。而这道题中由于串的数量比较少并且每个字符只会出现两次,于是可以扩展上面的那个状态,用 表示第一个串匹配到了 并且其它串匹配的位置集合是 的最大长度,转移是容易的。
完全没有写的欲望,甚至连解法都懒得描述了,放在这里只是为了尽快完成 kpi 凑数的。
甚至只需要暴力,比较厉害。直接从根节点大力向下找答案节点,如果某个子树内的节点超过一半就往这个方向走一步就可以了。判断是 的,最多会走 步,所以复杂度是正确的。
大脑停止思考了。用 表示当前第 位并且当前位是 ,已经用了 个 的情况下没被保护的人的最小值,可以大力转移,复杂度是 ,常数比较小可以通过。
大脑不能用了。傻逼都能注意到一个基本事实,即 ,因为只要有进位就会产生损失,所以只需要不存在相等的即可。直接记录一堆状态然后数位 DP 即可。
缺乏贪心的基本素质。首先需要注意到一个事实,即如果当前可以染色的最大值是 ,那么可以认为所有小于这个值的点都是被染色了的,这是因为所有操作影响的都是一个半开的区间,所以只需要最大化上面那个值即可。假如钦定了操作顺序,那么相当于每一步都使得 ,于是可以用类似于动态规划的方式来得到最大值。记 表示 最小的 个操作所能得到的最大的答案,考虑当前这个操作放的位置。如果放在最后一个那自然是好计算的,如果不是的话,那么前面所有的操作产生的贡献都是 ,于是把它放到第一个,然后贡献就是后面所有操作的最大值,两种决策取较大值就可以了。递推下去然后判一些显然的情况就可以了。
为什么有紫啊。显然应该有一些点对使得互为最近点才合法,处理完之后背包就可以了。
比较震撼,评价是这道题绝对是 AT 生的。你可以通过一些方式观察出如果 是偶数的话答案应该就是 ,分析一下,令整棵树是以 为根的有根树,如果对方某次不小心把根给露出来了我们就赢了,如果对方一直很谨慎我们也可以保证自己可以最后取到根,无论如何都是赢的。于是只需要分析 为奇书的情况,首先忽略答案是叶子的情况,然后需要分析出一些结论。第一个结论是对于两个距离为奇数的节点 ,我们能保证至少得到其中的一个,证明就考虑让对方把这两个节点露出来然后薅走就可以了,于是所有和 的距离是奇数的节点都是可以得到的了。第二个结论是说对于一个节点 ,三个子树中三个点 ,如果三个点到根的距离都是偶数的话三个点至少可以得到一个,用相似的方法可以证明。第三个结论是对于不包含上述点对的集合 ,对手可以保证自己能拿走所有的点,证明上可以归纳证明。第四个结论是说我们的答案只可能是结论一以及有 节点参与的结论二的形式,反证法即可。最后以 为根简单 dfs 即可。
还是想到了一些东西的,但是由于基本素养不够没搞出来而且调了很久。问题显然等价于最后图中只剩下来一些从左下角延申到右上角的路径,而路径的长度是有限制的,最优的情况下长度之和恰好就是 ,也就是说我们需要构造一种方法使得每条路径都尽量长。先 DP 出每个特殊点所在的层数,然后贪心就可以构造出合法的方案,贪心的过程就是考虑尽量向某个方向延申路径,这样可以保证正确性。
被撅惨了,脑子彻底锈住了。显然枚举一个左端点 ,求每个点 分出来最大值最小是多少,直接去做显然不行,此时需要想到一个很重要的事情,即当前 的答案发生变化当且仅当存在一种方案使得分出来的点存在 而且答案更优,所以对所有 的倍数进行一次递推得到答案就可以了。有一些细节需要注意,而且这道题比较卡常。
菠萝吹水。类似于反悔贪心的路子,由于随着次数的增加获得的贡献显然是不增的,所以每次在所有可能的决策中贪心选择最优的就可以了。用堆维护。
菠萝吹水。 很小,所以可以暴力找出可能的 种距离,超过这个距离的每次取最大值向下匹配,最后剩下一些比较小的元素让他们之间尝试匹配就可以了。
比较牛。有结论说一定存在一种最优方案使得每次操作的代价是零,证明上考虑每个代价非零的操作都可以通过一些次代价为零的操作拟合出来且不劣。于是每次找到代价为零的段进行操作即可,可以优化到线性。
贪心素养还是严重不够。如果只有一行的话答案显然就是 ,而目前有两行,对于一个前缀而言我们仍然有一个 和 ,答案应该是 ,而题目中上下交换的操作允许我们用一次上下交换来抵消两次的左右交换,进行抵消显然当且仅当 异号的时候,每当遇到这种情况贪心决策就可以了。
贪心素养仍然严重不足。首先有一个比较重要的结论说每次选最小的三角形这样选出来的三角形面积不降。证明上考虑选择当前三角形后生成的新三角形,分析发现新三角形不会更小。于是对 的奇偶性分类之后每次贪心取最小的三角形就可以了。要会猜结论啊。
大菠萝吹水。一个显然的策略是说每到一个 点就把油加满,到一个 点如果友不够撑到下一站的话就加恰好够用的油。所以每个 点找之前最后一个 点的位置并简单维护计算答案即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架