- 博客(30)
- 收藏
- 关注
原创 位运算的总结
这里我们运用集合与集合的思想,n ,k为两个不同的集合,如果可以使 n 修改为 k,我们是从 n 中去掉元素使其等于 k,那么 k 应该为 n 的子集。要删除最小的元素即为删除最右边的 1。这个题目和之前的类似,只是多了一个可以增加元素的操作,所以仍然是按位异或得到集合 s,这个集合包含 state 中独有的 (需要删除的元素) 和 goal 中独有的 (需要添加的元素)这里是要取两个集合的交集,我们可以用 set 来去重,把两个数组中的元素均存入 set 中,然后减去 set 的大小即为重复元素的数量。
2025-08-29 22:21:59
1547
原创 二分的总结
这篇文章想通过几个题来感觉一下二分应该怎么分析,如何使用二分算法对于二分,二分是二分性而不是单调性 只要满足可以找到一个值一半满足一半不满足即可 而不用满足单调性。一个二分题单我是习惯看到最值考虑二分本文题解属于拙见,水平有限,理性参考AcWing503. 借教室先来看看这个题的描述:要处理接下来n天的借教室信息,其中第i天有r个教室可以租借。一共有m份订单,每个订单包括三个正整数d,s,t,表示从第s天到第t天租界教室,每天需要租d个如果分配过程中遇到一份订单无法满足就停下来。
2025-08-19 10:51:16
2073
原创 Codeforces Round 1090 (Div. 4)
首先 b 数组是第 i 个人坐下的时间。可以存下每个时间坐下的人数,进而用前缀和得到前 t 时间坐下的人数。预处理出所有的质数,然后输出相邻质数的乘积,这样可以保证相邻数的最大公约数是某个质数,保证不会重复。对于每个人找到他坐下的时间,这个人可以坐下一定满足至少一个邻居坐下(所以对于两端点只考虑一个人)。找到两个邻居的最早坐下时间,如果此时的时间要大于当前的 b 则这个人在现在是无法坐下的,那么无解。时间坐下的人数,这样可以保证他不提前或者推迟坐下。双指针,输出一个小的,两个大的。时间坐下的人数,并大于。
2026-04-05 14:19:45
245
原创 牛客周赛Round 134
从这里可以看出修改后三个值是不可能得到全 1 的,除非数组本来都是 1。这样最多就只有 n-1。两个滑动窗口存储当前窗口的最大值和最小值,然后进行判断,进行左端点的更新。一个 1 可以变成两个 1,不断重复下去必然能得到 n-1 个 1。找到最小的 k 和 n 做对比得出答案。如果数组中全为 0,数组不会发生变化。但是由于有 d 的限制,所以要保证。一次修改后的三个数字的异或和变为。不看银牌都处理成铜牌。
2026-03-08 21:37:39
91
1
原创 牛客周赛Round 132(无F)
结构如果当前位置 gcd 为 1 的话,如果当前位置不修改那么只能从上一位置修改转移过来。可以直接将这个数字设置成 0,这样之后计算 gcd 时会直接返回另一个数的值。次,之后就是要处理下取整的问题,当和为奇数时就会进行下取整,即。先来明确一下,只有个位不为 0 时才能反转,反转不会改变位数。的操作,那么统计有多少个奇数、偶数,然后进行组合一共有。这样的话可能就会遍历很多,所以能剪枝的尽量剪。🤔并没有验证方法的正确性😄,一步一步试出来的。看到大神的简单题解了,写一下理解一下。检查有没有 5 或者 0。
2026-02-23 22:46:29
552
原创 动态规划02
用f[i]表示所有以a[i]结尾的严格单调上升子序列长度,初始时f[i]=1,枚举序列的倒数第二个数,用j(0<j<i)来表示,若a[j]<a[i]则。使用二分查找可以减少时间复杂度,对于新进来的元素a[i],如果a[i]大于f[cnt],则 f 数组长度加一,将a[i]添加进去。反之用a[i]替换掉 f 数组中第一个大于或者等于a[i]的元素。这样虽然 f 数组中存的不是最长上升子序列,但是长度是相等的。
2026-02-23 22:41:56
677
原创 动态规划01
把这个三角抽象为二维数组。动态规划,我们设dpij表示从11到ij的所有方案的集合的最大值。这个点可以由i−1j或者i−1j−1走过来。所以状态转移方程为dpijmaxdpi−1jdpi−1j−1])aij。答案就是最下面一层的最大值。
2026-02-21 20:29:27
657
原创 数学入门(快速幂&乘法逆元&GCD&质数&组合数)
分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。不用把n的阶乘求出来,只需要一个循环,从2循环到n,把每个数分解的变成1即可。判断一个数是不是质数就是根据质数的定义来筛选,如果一个数的因数只有 1 和它本身就叫做质数。这个题目其实也是逆元+快速幂,用费马小定理的结论然后推,不需要用高精度,直接在过程中取模。上面的太耗时了,如果一个数是已有质数的倍数那么这个数不是质数,这样我们就可以减少很多筛选。,可以先计算出 b 在模 p 意义下的逆元然后再计算。,1 的逆元为 1,我们设。
2026-02-17 19:45:59
1042
原创 牛客周赛Round 131
对每一个盒子都计算它所能达到的最大值,最后取所有盒子的最大值。每一对括号考虑其前后是否相同。果然我只有碰到这种简单题才能想到多解。对于每个位置计算:从左边能搬多少糖到。结尾的最长子序列的长度,它只能从。可以发现,单个 1 是染不出来的。要求最长子序列,我们可以用。、从右边能搬多少糖到。
2026-02-17 12:05:35
79
原创 2026牛客寒假算法基础集训营6(K H G B A)
首先先来个起步检测,如果一开始就踩缝隙了,直接 YES,用前缀和数组+二分查找来进行之后的判断,用前缀和可以记录每个缝隙的位置,二分去找第一个大于后脚跟的缝隙,之后判断是否猜到缝隙。来表示这个数字能否到达,然后进行 n 步操作,每一步操作都有一个内循环去处理之前操作所能到达的值。问最后一次操作是谁进行的,先计算一下最多能进行多少次两人操作,然后再看是增加 m 超过 z 还是增加 m+n 超过 z。然后就是简单的计算了,最后一个循环把现在的斜边长计算出来。数组这样会导致错误,所以先用一个 ne 数组去存储。
2026-02-16 19:04:48
602
原创 2026牛客寒假算法基础集训营5(B D G J F )
和合并石子类似,用小根堆来存,从小往大合并。每次取最轻的处理,两两合并,如果只有一个,那就取下个组的一个合并。假设我们使用 x 个 qcjjkkt,y 个 td。重叠的越多越节省长度,最多重叠。数组来记录此时状态为 i 执行第 x 种操作后的状态。模拟吧,把每种情况的操作用数组写一下就能过。最大,固定 x,我们去找 y,可能取 0、按行数和列数进行划分。也是模拟吧,暴力检查。
2026-02-16 19:04:13
330
原创 小苯的最短路
对于前半部分,如果 n 为偶数则为 0,如果 n 为奇数则为 1;对于后半部分,连续整数从 1 到 n 的异或结果有个规律,令。结论题,首先需要推导的是怎样走最短,是直接从 1 走到 i 呢还是绕路经过某些点到 i 呢。假设我们通过点 j 到达点 i 吧。所以可知直接从 1 走到 i 最短。
2026-01-28 21:37:21
243
原创 图上问题(并查集&dfs)与单源最短路
这里我们可以反向思维一下,如果反向建立连边的话,从序号较大的节点 dfs 如果一个节点被访问过,那么访问的起始点就是最大值了。首先初始化所有节点的距离为无穷大,起点距离为 0,使用优先队列维护,优先处理距离最小的节点,遍历其所有邻接边,更新节点距离。给出 N 个点,M 条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点。带路径压缩的查找,可以在查找过程中将遇到的节点的父节点都替换为根节点。合并操作,找到两个集合的根,将任意一个集合的根指向另一个集合的根。
2026-01-27 21:55:58
1028
原创 Acwing125.耍杂技的牛
要得到最大风险值的最小可能值, 这句话可能比较难懂,就是要让所有牛的风险值最小,然后在这些最小的风险值中找一个最大的,我的想法是让下面的牛越强壮越好,上面的牛越轻越好(反过来就是下面的牛越重越好),这样的话就是使。这个题的数据也是重量和力量,风险值(一头牛支撑不住的可能性)取决于它头上所有牛的总重量减去它的身体强壮程度的值。这里把该牛上方 k 头牛的体重 w 求和与自身的强壮值 s 相减。按我们的想法当上面的牛的。位上的牛上升,所以加上。由此可以得出当上面的牛的。⬅第 i+1 位的牛。时我们就要进行交换。
2025-12-31 22:00:08
760
原创 大一第六次周赛题解
思维题意:找到另一个整点 C,使顶点组成的三角形任意两边之和大于第三边,且所组成的三角形面积是正整数。分析:要使面积是整数那就让底乘高为偶数。可以去构造一个与坐标轴平行的边且长度为偶数作为底边longlong::0tie0tie0;
2025-12-28 00:08:49
545
原创 Codeforces Round 867 (Div3) E
求变成“反回文串”的最小次数。我们先来看看它的要求,sisn−i1, 比如我有 5 个字符,要求第 3 个和第 5-3+1 个字符不同,很显然这是不可能的。所以对于奇数长度的字符串,这个要求不能满足。再观察一下还有什么情况不满足要求,对于cccccc这样的字符串无论怎么交换都不能满足要求,这可以是一种情况,再来观察一下,cccccb呢?也不可以,我们来找找可以满足要求的最多的 c 的数量,cccbbb,所以当一个字符出现的次数大于n/2时也是无解的。
2025-12-28 00:05:46
929
原创 双指针的总结
今天是双指针算法两个指针i,j有两种扫描方向:1.反向扫描:i,j方向相反,i从头到尾,j从尾到头,在中间相会。2.同向扫描:i,j方向相同,可以让j跑在i前面。同向扫描的两个指针称为“快慢指针”,快慢指针在序列上产生一个大小可变的"滑动窗口"。
2025-08-27 00:06:23
455
原创 CF2001A. Make All Equal
可以证明一定存在一对相邻元素,满足前者小于后者。序列是一个换如果不存在前者小于后者那就会推导出x>x这是不可能的。这个题要求使所有元素相等的最小操作次数,我们应该找到数组中数量最多的数,那么其他的数就是要删除的。在非众数被删光之前我们可以这样把序列表示成这样。
2025-08-26 22:49:32
300
原创 CF1768B. Quick Sort
这个题我们从1开始扫数组,把能够按顺序排下去的数字个数记录下来,用总数减去就是需要排序的个数,再除以k,如果能一次拿出来结果就是1,不然就是n/k上取整。
2025-08-25 23:02:10
218
原创 差分的总结
其实差分就是前缀和的逆运算,通过前缀和的相减可以得到数组的原值一维差分,给定一个前缀和序列a,我们可以通过计算得到它的差分序列这里差分序列b定义为: b[1]=a[1],b[i]=a[i]-a[i-1];我们可以通过差分来实现区间操作,若要把a的区间[l,r]加d,就可以通过b[l]+d,b[r+1]-d的操作实现,AcWing 797. 差分AcWing 100. IncDec序列这个题让我们用最少的操作次数使得a数组都一样,转化思想就是让差分序列b都为0,b[1]等于a[1];
2025-08-23 17:07:30
584
原创 CF2069A. Was there an Array_
我们可以进行分析b[2]是1说明a[1],a[2],a[3]相等;b[3]是1,说明a[2],a[3],a[4]相等,b[4]是0,说明a[3],a[4],a[5]必然存在a[4]和其中一个不相等,那么应该是a[4]和a[5]不相等吧,继续推b[5]是1,说明a[4],a[5],a[6]相等。那么我们假设这里是1001呢,b[5]是0,说明a[5]和其中一个不相等。b[6]是1,说明a[5],a[6],a[7]相等。对于这类题,我们肯定应该想的是怎样就构造不出这样的数组了,而不是想怎么去构造,这是困难的。
2025-08-21 00:44:11
278
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅