自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 CF(错题集1300-1500)

这是一道1500的构造题,这结论怎么想得到。我一开始真的没啥思路。每行都是一条树中的边,例如34,也就是说3和4直接相连。我们要在题目给的树里面,找到最少的次数将所有节点染为黑色,可以两个一起染,这两个节点必须满足不在同一行并且没有直接相连。核心结论:最少的步骤在每行节点最多的个数和每个节点子节点个数+1的最大值里面取最大值。通过题目的限制条件,我们能得出最后的答案一定要大于等于每行节点个数最大值,并且要大于结论中的后者。但是我们不能够直接构造成他们两个中的一个吧?

2026-10-31 03:30:00 3

原创 CF(1400-1400&1300-1500)

多米诺骨牌一个会占两个格子,多米诺骨牌的两个部分颜色需要不一致,牌不是重点,颜色不一致才是,然后还有多米诺有两种形式,一种是躺着,一种是站着。说人话就是上下两格和左右两格,我们观察这种排布不难发现,站着的情况下,不会影响这一列的颜色分布情况,躺着的就是不影响一行的颜色分布,观察到这一核心之后题目就变得简单了。

2026-10-11 16:35:50 187

原创 CF(1400-1400&1300-1500)错题集

本来楼主认为只要前x+1次都投一块,然后一次能拿出比之前多1快就行, 就是x+1+(x+2)/(k-1)<=a,但是我发现我的理解有问题,我们每次投入的都要以赚的前提去投,先设两个变量,sum和bet,bet表示本次投入的本次需要投入的硬币枚数,因为每次都要当作回本来投入,所以bet(k-1)-sum要大于等于1,也就是bet=sum/(k-1)+1。需要注意的是x在这里指的不是保底机制(输x+1次后,一定能赢),而是赌了x次后就不能再赌了。

2026-09-30 18:46:08 185

原创 CF(1400-1400,1300-1500)

lz对这种题是完全没有抵抗力啊,写一道错一道。这题核心是找到b数组与a数组的关系。ai=ai-1+bj(这里的i-1指的是前一个数)又因为ai是大于等于1的,所以就得到了ai-1与bj的关系,bj大于等于1-ai-1,这里bj是已知的,也就是说只要用lower_bound找出来就行,然后ai-1就是ai的钱一个位置,最小就是a1,然后一次次增大知道an,所以这题可解。那么a1的选择呢?因为大于0,所以要找数组里upper_bound(0)的数,如果没有就-1。所以这个初始数组我们可以用multiset来存。

2026-09-25 19:47:03 235

原创 CF——错题的集合

这题lz一开始看到要构造两个数,再加上找不到啥规律,一开始是朝着所有数的和思考,因为我把插入的数看作是每个数的目标,但是我忽略了x,所以我没想出来。因为这题的关键是找到x,找到插入的数要排在找到x的后面,因为插入的数其实是通过x得到的。我还有一个错误的原因就是将目标数与所有数的和找关系,其实是数组里的最大数。这个最大的数是怎么得出来的?,可以这么说,因为每个数都要加上x再加上每个数都不同,故想到以最大的数作为目标数。但是为什么不用数组中的最大数加上x作为目标数以及插入的数?

2026-09-15 20:54:43 61

原创 CF——错题集和

第一眼,哇,这题好简单,WA了,题目错了吧。还是嫩了点啊。我的思路是将连续的相邻自然数归为一组,求组数,但是实际上就算中间隔了一组数,前后依旧有可能有父子关系。举个例子,样例1中的最后一个就是很好的例子。9 8 9 2 3 4 4 5 3,末尾的3与第四个数2,其实也有父子关系,就是2其实也是3的根,只要我们把中间的45合并了就可直观的看出了。

2026-08-29 17:56:25 157

原创 CF错题集

我有一个想法,首先取每个树枝的顺序肯定是从上到下,第一个不用考虑重叠,随后的n-1个树枝,通过底部的坐标加上高,与它上面一个树枝的底的坐标进行比较,小则没有重叠,反之,则有重叠。那么重叠该怎么计算,可以用三角形的面积减去重叠部分的面积。但是我感觉应该还有更优的解法。其实已是最优解。证明的话,时间复杂度o(n),满足了。

2026-08-26 12:00:20 150

原创 CF错题集

题目的意思理解就卡住了我,首先我们要弄清楚题目说的最大前缀位置的含义:在所有前缀和 S1,S2,…,Sn​ 中,取最大值,然后取i 使得 Si​ 等于这个最大值。也就是说,我们要找到出现全局最大前缀和的位置。那么最大后缀位置的概念就是取到最大后缀和的最大i,另外,最大后缀和可以等价于Si-Sn。构造的思路,看到x,y这样会让人想到分段,再加上要求数组只有+1或-1,这样我们就不男想到分段用+-1的震荡性去构造数组。前段,交替+-1,使得y位置的前缀和为0或1,让这个值最小。

2026-08-21 17:15:02 200

原创 CF——错题集

或的运算,涉及到二进制,两个二进制数对应位上的数字,都是0结果则是0,有一个1则结果就是1。我一开始没想到贪心,所以我的思路就偏向找到0到m然后从大到小遍历找到或为x的那个数组。如果考虑贪心,首先遍历的顺序就变了,变成了从小到大,假设我们要使得数组MEX为m,那么数组里数就得是0,1,……,m-1,不能出现m。所以我们的目标就可以变成:在确保数或为x的前提下,尽可能多的扩大数组。正式进入解题,假设此时我们已经将k个数字填入数组了,并且此时的或和为cur,剩下的位置为n-k。

2026-08-15 13:21:55 172

原创 Codeforce错题集

写完这道题我感觉我对dp动态规划的理解又多了一些。动态规划的题有两个核心1.最优子结构,一个大问题,可以由多个子问题的最优解组合而成。在本题中的体现,就是位置i的最优解只需要知道i+1处“当前翻转为偶数次的最大值”和“当前翻转为奇数次的的最大值”。右侧子问题必须是它自身的最优解,才能保证组合起来是全局最优。2.重叠子问题,求解的过程中,同一个子问题可能被重复计算好几次,dp通过存储避免这一点,同时这也是动态区别于分治的核心点。

2026-08-12 03:53:27 196

原创 CF202608

这道题的思路给我很深的印象,要使得x*y之后数字的种类不变,最好的办法就是构造出两个x拼凑在一起。我们就可以令y为1^m+1。这样就可以实现上面所说的了。

2026-08-04 01:38:13 225

原创 CF——1743C Save the Magazines

假设一段有盖子的箱子前面没盖子的箱子的杂志数量为a,这一段有盖子的箱子里杂志数量最少为b,设ans一开始为初始有盖子杂志数的总和,那么如果移动这一段盖子,那么对结果的贡献值就是a-b。(什么杂志,需要被拯救)我们可以将第i个箱子上的盖子移到第i-1个箱子上,盖子的总数不会变,题目要求调节盖子的位置以达到能拯救的杂志数量最大化。这样就会导致连环效应,这是一个原因,主要的还是,我们要达成目标就得找到一段盖子中杂志数量最少的,这样对结果的贡献值就会最大。为什么要选择移动一段盖子?怎么对结果产生贡献?

2026-07-28 02:52:46 222

原创 CF——https://codeforces.com/problemset/problem/1426/C

可以说是一道披着算法题外衣的数学题。

2026-07-28 02:18:59 228

原创 CF——2128B - Deque Process

与其说选择打乱顺序的,不如选择较大的或者较小的。具体一点就是在奇数回合,我们选择较小的,在偶数回合我们选择较大的。这样可以保证在第二个数大于第一个数的时候,第三个数会小于第二个数。例如【1,3,4,10】,我们在奇数回合时选1,然后下一回合选10,再下一个回合选3,最后选4。题目要求我们建一个新数组使得其单调性不能连续超过4个。最好变成q1<q2>q3<q4....。

2026-07-24 22:39:46 218

原创 CF——300A.Array

题目的要求比较简单,给我们n个数有正数负数还有零,要求我们分成三组,第一组乘积为负数,第二组乘积为正数,第三组的成绩为零。我一开始的错误思路:将第一个负数存入第一个数组,剩下非零数全部存入第二数组,我这样的想法建立在我片面的认为零数组只能存零,所以题目为了满足条件,只能将负数的个数定为奇数。很显然我是错的,我的想法经不起推敲。正确的思路是贪心,也就是第一组留一个负数,第二组为空时,存入两个负数;不为空时,存入一个正数。两种情况,剩下的非零数都存入第三个数组。我觉得我的错因是,题目的理解不够深。

2026-07-19 00:00:00 146

原创 CF——1520D - Same Differences

这道题的题干很简单,一个数组,长度为n。要我们找出其中第i个数加上j-i与第j个数相等的对数,面对这种题目的时候,我们可以往数学角度考虑。因为这道题模拟起来很简单,所以我直接双循环,结果就是timelimit,这也是必然,毕竟时间复杂度来到了O(n^2)。运用数学,将题目的等式化为a[i]-i=a[j]-j,这样问题就简化了,找到数组里a[i]-i的个数cnt,然后C(cnt,2)。这样既可以不漏也可以去掉那些只有一个的。

2026-07-19 00:00:00 226

原创 dfs——图的遍历

这道题我们可以使用倒着建图然后从末开始尾遍历dfs即可。这样做就像是提前知道了能到达的最大编号,可以省去不少时间。还有优势就是每个点只用被访问一次,最大值能到的点答案就是最大值。

2026-07-09 01:07:23 28

原创 unordered_map加上set——阅读理解问题

题目要我们做的就是让我们找到某个单词的位置,按从小到大输出。首先先看到位置,我们可以把第一行的每个单词映射上1,然后第二行的单词如有重复就放入set,后面以此类推,用set的好处就是不用再进行排序。这样相当于每个单词都有自己的位置集合。然后他需要哪个单词,我们输出对应的集合即可。

2026-07-07 00:22:19 34

原创 并查集——亲戚问题

我们可以初始一个集合然后定一个代表数据,集合内每个数据都与这个代表数据有关系,假如两个数有关系,但他们的代表值不一样,那么可以将他们两个集合合并。处理完之后,就可以判断了。这里有一点问题,如果数据一大,因为判断两个数需要遍历整个集合,所以如果这个树很长,那么最后的复杂度就会很高,那该怎么办?我有一计,因为我们判断的时候不需要这个数与除代表值以外的值有关系,所以,我们可以把每个值直接对应代表值,即压缩路径(return parent【x】= find 【parent【x】】)(真是太聪明了);

2026-07-05 19:46:48 33

原创 二叉树——遍历问题

题目的意思就是给你两个遍历的方法,让你求第三种遍历是如何进行的。直接看到后序遍历——左子树,右子树,根,按照这样的顺序进行遍历。我以题目的例子来遍历,第一个根为C,然后C的左子树为B,然后B也是根,B的左子树为A,所以第一个输出的是A,然后B这个根的右子树为D,D也为根并且D的左子树为E,右子树为F,故A后面输出的是EF然后是B右子树的根D,然后是C左子树的根B,这样就遍历完了C的左子树,然后输出C的右子树即可。

2026-07-02 00:30:21 203

原创 栈——验证栈序列

这道题题目要求我们验证这个输出栈的顺序能不能实现。栈我是理解的,先入后出,可是初看这道题我就是没啥思路。在输出序列里面的第一个数肯定是我们一次性要输入栈的最后一个数,找到这个数是关键,假如下一个数又两者又不一样了,这时候我们就要重新从那个数开始往后找到与输出序列里第二个数一样的数。假如下一个数一样,那么输出序列继续往下找,然后把栈顶的数拿出来就行。最后判断栈里还有没有数就行了。在栈里找数的时候有个需要注意的地方,我们要提交对栈是否为空进行判断,加入空了就退出,不然的话会RE(可以想一下为啥?

2026-06-27 18:45:42 155

原创 链表——排队问题

但是这样的话输出就有问题了,因为我们第一个要输出的不一定是链表第一个,也就是我们找不到初始点。在初始化链表的时候我们可以加一位零同学,然后,第一个输出零同学右手的同学,最后到零同学停止。这是我第一次用链表做题,目前我对链表的理解就是,我们要找到一个东西将两个数据连起来,比如说这道题里的插入同学在指定同学的左边或者右边,我们可以把这理解成俩个人牵手。我们可以用插入的思路,不过这里有更简单的,就是在我们定义结构体的时候加一个旗帜,然后给要删除的同学做上标记,输出的时候我们只要输出没有被标记的即可。

2026-06-26 17:26:17 226

原创 线性表——柜子的存查问题

这道题的思路很简单在第n个柜子里的第n个格子里装入k,我一开始想的是用一个二维数组,行号表示柜子号,列号表示格子号,如果数据小一点确实可以。这题的最优解应该是用一个线性表。在我的小助手的帮助下我学到了find的作用是遍历map【i】里的数据直到我们找到我们要的;如果遇到k等于零就直接去掉这一部分;

2026-06-24 16:54:13 24

原创 BFS——求迷宫步数

如果会BFS的话这题的难点就剩下传送了,不过思路还是比较简单的。不妨写一个函数,在搜索的时候假如搜到了字母,则调用这个函数,这个函数里面可以通过遍历除这点以外的点来找到另一个传送点,(我刚开始想的是把每个字母在输入的过程中就记录下来,还是这个神犇的思路更加的简单啊),然后把坐标改成另一个传送点的坐标即可。说完传送,其他的地方呢?首先输入没啥好说的,包括输出?最早到达的路径步数最少嘛。然后就是搜索,优先队列现在也好懂了,先入先出。运用了栈的思想,这句话就是通过队列实现的。(看在我还要考试的份上,给个赞)

2026-06-23 17:55:11 35

原创 搜索——染色问题

我们可以发现,输出的结果只有两个状态,一个是输出本身,另一个就是输出*,所以我们就可以写一个二位bool数组,值为1则输出本身,否则输出*。染色的搜索有点像走迷宫,必须得走到终点这条路径才能被染色,所以在搜索函数里写一个终点判断,然后再写一个if判断下一层是否可行,可以的话,标记上1。还有就是搜索里的if判断逻辑上应该是从最底层往上遍历,触底反弹的感觉。虽然这题直接看得题解,但这道题可以说为数不多理解如此透彻的题目了,在前一天的晚上写完并理解,在我看完一场比赛,早上5.重写这道题,能不看一次性写下来。

2026-06-21 12:46:29 172

原创 dfs——迷宫问题

整体上的思路先朝一个方向总到终点碰到障碍物返回,碰到边界返回,碰到已经走过的路返回,碰到终点先记一次再返回。障碍物和已走过的方格可以建两个二维的bool数组,然后在主函数里把障碍物记录进去,在dfs函数地推的过程中对经过的方格进行标记即可。这题要求的是可以到达终点的路径数。我第一时间想到的就是dfs,思路没啥问题就是细节上还需打磨,不过在我的小助手的帮助之下最后还是ac了。最后呈现ac代码之前我想先提一下有一些注意的地方。虽然题目里说了每个方格只能经过一次,但是这有个条件就是在每条路经里才成立。

2026-06-20 19:18:18 35

原创 BFS——陨石砸落找安全地最短时间

设一个二维数组,初始值定为-1,将时间存入对应的时间里,前提是当前位置未超出范围,并且值为-1,或者此时的时间要小于已标记的时间。我的想法是主人公是往前走的,走过了这个地方就不会回来了,所以呢,我们只需要记录最早的时间,如果最早砸下来都砸不到更别说晚一点砸下来的陨石了。这题,我感觉是比较经典的广度搜索,(虽然我也只是做了几道BFS),总体的思路大概就像跟随时间的增加和下一个时间段陨石的砸落地点找到下一秒能走的位置,可以的话就存进一个队列里,下一层搜索的时候再提取出来使用,直到找到安全的位置或者是走不出去。

2026-06-20 15:31:34 176

原创 DFS(深度搜索)——电梯上下走问题

这道题要求的是最短路径,所以dfs加上减枝就挺简单的了,关于为什么看题解?一开始我想这这道题好像要dfs加上广搜,(就是先广搜出所有答案,然后dfs出最好的那一个,好像是因为我不太理解dfs以及广搜的结果,还需努力啊)我看题解代码的思路就是dfs的时候到达每一层所需的步数在一个固定的空间里,每次遇到更好的解的时候就替换原先的答案。看完这题我觉得这跟遍历马儿那题很像,这两题求的都是步数,因此都可以用广搜,但是我不会广搜,所以我看了题解,发现深搜也可以做,深搜思路就是一条路走到黑然后回溯。

2026-06-19 17:43:34 232

原创 二分答案——设备耗电充电宝充电问题

题目的意思是让我们求设备最长的使用时间,题目里的单调性,使用时间越长,所需要的能量越多。但是充电宝的能量为二分出来的时间乘以他的功率。我们可以忽略在我们规定时间内设备耗电量小于它自身储备量的设备。(我自己想的时候为什么想不到)依旧二分答案,依旧不会。笔记之前我的进步就是找到了这道题单调的地方,不足就是该怎么向代码转化以及涉及小数的二分边界不太懂。剩下的就是一些边界以及循环条件的问题;

2026-06-18 17:43:28 26

原创 二分答案——跳石头问题

首先我们可以二分跳跃距离,将其视作最短距离,然后在通过一个judge判断是否比最短距离大,如果是,则说明此解可行但并非最优解,然后我们就向右边二分,因为我们要使最短距离最大,所以最优解因该会在右半部分。我们可以模拟一个选手的比赛过程,我们开始从i=0出发跳到下一块石头的时候判断一下跳过的距离是否比我们二分的距离小,如果是的话,那就要挪一块石头,这时候计数器可以加1。

2026-06-17 19:43:32 219

原创 雷霆dfs+剪枝+递归

now是现在已经取了的个数然后sid是取到的下标,sum是和。因为现在取了now个了所以只剩下k-now-1个待取了所以下标的终点就是n-(k-now-1)了。第一问的答案就是对数组的下标进行不降原则就可以。二.在取12与19这样后面不满k个的时候都无法运行得使用剪枝消除多余;一.在代码中 这些数都存在数组里该怎么实现3--->7--->12----->19。不知道为啥我在暴力枚举的题单里老是在用递归干嘛,用了也看不懂呢)。得3 7 12,3 7 19;例如题目给的例子3,7,12,19;

2026-06-12 22:15:19 168

原创 关于函数在主函数被调用时的一些注意事项

问题就在主函数里使用up,方法是将要改变的结构体写在up()的括号里我想的是在循环里顺便输出a[i],但是结果让我不能理解,因为输出的是操作up函数之前的结构体。思路很简单:写一个包含姓名(char)、年龄(int)、成绩(int)的结构体然后在写一个实现培训的函数,最后输出。a[0] = {name, 18, 500} → 拷贝一份 → 副本 = {name, 19, 600}a[0] 依然是 {name, 18, 500} ← 没有被修改!在写P5744时(虽然是入门)

2026-06-12 22:11:47 165

原创 dfs在组合与全排列之间的不同的用法

然后要递归之前先判断这个数是否被使用过,如果被使用过则遍历下一个数,反之先标记这个数然后存入要输出的数组,在下一层递归返回时让标记回溯。deep教我的方法是给1~n自然数定义一个判断表。要在1到n的n个自然数中找出所有r个不重复组合例如n=5,r=3;那么就有1 2 3,1 2 4,1 2 5;第二个问题(全排列)顾名思义:找出1~n的自然数所有可能(不重复)并输出。这就是刚学到的不降原则再加上dfs与之前的一摸一样。第一个问题先来解决这个组合输出————在1~5找3个数的组合。

2026-05-30 16:58:58 244

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除