- 博客(81)
- 收藏
- 关注
原创 20260301来作梦总结
贪心,用两个数组pre和last分别表示b数组前缀后缀能收集的花,如果有 i (1<=i<n) 满足pre[i]+last[i+1]==m,那么输出0,不然如果有 i (1<=i<n) 满足pre[i]+last[i+1]==m-1,输出b[i]最小的,否则输出-1。分类讨论,首先判b数组是否全为-1,是就输出mn+k-mx+1,否则看目前b数组是否相互矛盾或要符合条件只能填充负数就输出无解,否则就只有一种。签到题不用讲了,巨佬们都AC了。构造,随便写一下就行了。
2026-03-01 20:24:38
173
原创 20260228OI总结
贪心,无论如何每一个冰期都会有至少两倍的警示期,那么拿一个数组模拟每天是否是警示期,首先把所有冰期作两倍的警示期,然后枚举最优的最长冰期,最后输出最优答案。
2026-02-28 20:09:46
154
原创 20260225OI总结
还是DP,dp[i][j]表示a数组的前 i 位和b数组的前 j 位需要的数最小值,答案就是dp[n][m]。,要是老师提前说时限为4s说不定我能想出来的……模拟,对应输入再判重即可。小模拟,对应输出即可。
2026-02-25 19:35:42
137
原创 20260224OI总结
于是O(n)写法呱呱降世,只需枚举这个k,看较小者是否大于等于l,求一个最大值。" 码量低常数小 "--------jo3er。首先求出所有两两相邻的异或之和(包括首尾),每次左移时把序列看成链表破链成环,直接挪动区间下标,输出减去首尾异或值即可。第一种:二分答案,时间复杂度O(nlogn)。一看就是DP,但写不出来……第二种:玄学,观察样例,我推出一个结论。
2026-02-24 21:11:53
183
原创 20260202OI总结
递推,稍微打表推一下就可以得出状态转移公式dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*(i-1)服了,写了个单调队列的写法,直接TLE,正解是树状数组+线段树。这题floyd,我写的神秘n遍bfs也是只有47分了好吧。
2026-02-03 19:49:06
170
原创 20260201OI总结
大模拟,用substr提取字串会简洁亿点点,处理年份是第几世纪时要多加几个条件,不然就会像我一样挂25分或更多。神秘DFS/BFS,不知为何一直调不对,最后10分钟只能骗个20分了。前缀和签到题,没对的人肯定是freopen有问题。贪心+单调栈,我没用单调栈TLE又挂了30分。
2026-02-01 21:36:50
235
3
原创 20260130树上差分总结
典型的一道树上差分的题,首先把LCA预处理出来,然后在a数组里找到每个两两相邻的点作树上差分,差分完求前缀和,最后因为枚举相邻点时中间节点会多放一个,且最后一个节点已经到了厨房会多放一个,所以前缀和完了后这几个节点都要减1。相当于把边权放到连接的儿子节点上,那么就转换成c[A]+=val,c[B]+=val,c[LCA]-=val*2。定义c[i]=a[i]-a[i-1],特殊的c[1]=a[1],c[n+1]=-a[n]。首先把LCA预处理出来,然后点差分,最后用一次dfs前缀和,求最大值输出完事。
2026-01-30 21:32:16
300
1
原创 20260129LCA总结
经打表证明,三个点的LCA必定会有两个重叠,这意味着重叠的那一个结点绝对在最上面,单独的结点在下面,而下面的那个结点离三个节点的距离和一定最近,所以第一问只需找出单独点即可,第二问就是单独点对应的两个点的距离再加上另一点和单独点的距离,这样就不用再单独求3遍LCA,常数大大减小。这题仅仅只是前一题稍微加强了一点,我们知道两个点的距离为dep[x]+dep[y]-dep[LCA(x,y)]*2,那么三个点的话另一个点跑到这两点的LCA距离一定是最近的,所以枚举两两之间的LCA,取最小值。
2026-01-30 12:41:20
456
原创 20260128树的中心和树的重心总结
然后任意指定根结点root后维护点 i 子树内的最长链dis1[i]以及子树外的最长链up[i];其次考虑x->v的连边,up[v]一定可以继承up[x],因此up[v]=up[x]+w;最后up[v]拼接x的dis1[x]时,会出现dis1[x]的路径穿过v到v子树内的情况,,因此额外维护dis2[x]表示x子树内的次长链。最后维护x子树内和子树外的最大子树大小mx[x],若mx[x]*2<=n,则x是一个树的重心。当选取x为树的根结点时如果树的高度最小,那么x就为树的中心。
2026-01-28 21:47:37
388
原创 20250124树的直径总结
再否则不行,那么alice考虑最后的最优策略:把bob逼到叶子节点去,假设bob已经到叶子节点了,他还要脱离的话就得一次跳过alice的捕捉范围,也就是说要bob胜必须db>da*2,否则alice胜。就比如你要抓博尔特,在死胡同里抓,博尔特跑到最里面除非从你头上跳过去否则你都一定抓得到。否则接着alice考虑最优策略:跑到直径的中间位置,这样她距离所有点最近,这样如果直径的一半向上取整小于等于da,那么alice必胜,因为这样无论bob跑到哪alice抓一下就抓到了。模板参考代码注释即可。
2026-01-26 19:27:22
291
原创 20260112树状数组总结
本文介绍了树状数组的基本原理及其应用。树状数组通过lowbit运算实现高效的单点修改和区间查询操作,核心思想是将数字分解为不超过logn个2的幂次之和。文章提供了三个典型例题的代码实现:B3612展示了基础区间和查询,P3374演示了单点修改和区间查询,P3368则利用差分数组实现区间修改和单点查询。所有实现均基于lowbit运算,通过递推方式快速计算前缀和,展示了树状数组在算法竞赛中的高效性和实用性。
2026-01-14 21:21:39
102
原创 20260110 ST表总结
其实ST表难度较低的题目码量并不多,但通常不会直接告诉你就是ST表,而且通常会和其他算法融合在一起就比如动态规划、前缀和之类的,ST表的显著特征是查询快,所以遇到需要求多次区间最大值、最小值、GCD之类的问题八成是ST表。
2026-01-14 20:14:11
336
原创 20260105 莫队总结
莫队是一种高效的离线处理区间查询问题的算法,本质是一种经过优化的暴力算法,该算法基于以下核心思想:当已知区间 [l, r] 的答案时,可以以 O(k) 的时间复杂度(k 通常为 1 或 log n)计算出相邻区间 [l±1, r] 和 [l, r±1] 的答案。当取 B = √(n²/m) 时,达到最优时间复杂度。通过合理选择块大小,可以确保整体复杂度为 O(n√m)。
2026-01-09 21:52:56
332
原创 20251227点双 割点 割边总结
本文介绍了图论中的连通分量、割点、割边和点双连通分量概念及其算法实现。连通分量是指图中极大连通子图,割点是删除后会增加连通分量数量的顶点,割边则是删除后会增加连通分量数量的边。文章详细阐述了Tarjan算法的实现原理,包括维护dfn和low数组,以及割点和割边的判定条件(时间复杂度O(n+m))。特别说明了点双连通分量的性质:删除任意顶点仍保持连通,且相邻点双最多共享一个割点。通过栈结构和DFS回溯机制,给出了点双连通分量的具体实现方法。这些概念和算法在图的连通性分析中具有重要应用价值。
2026-01-03 12:58:22
954
原创 20251222强连通分量总结
有向图的子图中的任意点相互连通叫做强连通子图,而如果该子图不能再大了也就是已达到最大,那么该子图叫做极大强连通子图,也就是强连通分量。把强连通分量中的有向边替换成无向边,就是一个边双连通分量,所以求边双连通分量更求强连通分量差不多,只需多判一个重边就行了。那么该图有三个强连通分量,分别是{1,2,3}、{4,5,6}、{7}。就是找到强连通分量后将整个强连通分量缩成一个点,按上图作样例。一张有向图,如果该图任意两点之间连通,则称该图强连通。打星号的是强连通分量的编号。
2025-12-27 11:15:22
464
原创 20251220LCA总结
最近公共祖先简称LCA(Lowest Common Ancestor),两个结点的最近公共祖先,就是这两个点的公共祖先里面,离根结点最远的那个,方便起见,我们设两个节点的LCA为LCA(x,y)。一个结点的祖先就是他父亲的父亲的父亲……那么可以发现,两点的最近公共祖先一定在两点去往根结点的路上,以此推出朴素LCA。然后将这两点同时往上跳,直到两点重合,此时这就是他们的最近公共祖先。首先将深度更深的结点往上跳,跳到与深度小的结点深度相同。公共祖先,就是两个结点相同的祖先。
2025-12-27 10:31:14
258
原创 20251215最短路总结
,但实现简单(仅需三重循环),且常数项较小。该算法适用于各类图结构(有向/无向图、正/负权边),前提是最短路径必须存在(即图中不能包含负权环)。,表示在仅允许经过节点 1 至 k 的子图中(记作 V’={1,2,…,k}),节点 x 到节点 y 的最短路径长度。通过逐步扩大问题规模(k 从 1 到 n),即可计算出所有节点对的最短路径。该式表示:当前最短路径要么不经过 k 节点(前一项),要么经过 k 节点(后一项)。即为全图 V 中 x 到 y 的最短路径,因为此时 V’=V。虽然算法复杂度较高(
2025-12-26 13:47:49
409
原创 20251213最小生成树总结
首先将每条边按照边权升序排序,然后用一个并查集数组来维护每个点的所属集合,枚举每条边,看这条边所连的两点祖宗是不是不一样,不一样就连边,边数变量加一,如果此时边数变量为n-1,可以直接输出目前所用的边权和。给你一张n点m条边的连通图,要你从m条边中选择n-1条边使这n个点形成一棵树,这就叫生成树。该算法是一种经典的贪心算法,可用于求最小生成树的边权和。各边的长度之和最小的生成树就叫最小生成树。
2025-12-26 13:30:02
232
原创 20251208树上启发式合并总结
树上启发式合并在处理离线问题时,其效率往往优于或等同于其他算法,同时具备更容易理解和实现的优势。传统解决方案通常依赖复杂的数据结构,但对于可离线处理的问题,是否存在更简便的方法?,即对每个子节点执行一次遍历(每次遍历复杂度与n同阶),n个节点导致总复杂度为。注意到每个节点的答案可由其子树及自身信息推导得出,这一特性可用于优化处理。启发式合并算法通过将高度较小的树作为高度较大树的子树进行优化。离线处理的核心在于通过预处理实现。直接暴力预处理的时间复杂度为。时间复杂度的查询输出。
2025-12-26 13:15:55
247
原创 20251224DP小测错因
题意:给定n个点,允许添加k个点,使得所有点的x和y都是正整数,且选出的点的序列构成一条最长的折线,x和y单调不减。因为序列中相邻两点的关系只有两种,要么在下面,要么在左边,所以对于点 i 和点 j ,中间需要添加的点数=本来用的精卫填海的思路,后来发现写错了,于是就仿照kkksc03临时抱佛脚来写,于是A了。杨老师的原话:“这道题没有人能拿到”然后顿了一下,“40分以上。表示以第 i 个点为结尾已经添加 j 个点的最大长度。为什么有一个人没有A呢,好 难 猜 啊 ~40分是骗的,不要以为我想到了正解……
2025-12-25 22:10:55
357
原创 20251206并查集总结
我们还要一个函数来找一个节点的祖宗,因为集合合并时并不是所有点都被更新了,所以还要路径压缩。我们用一个数组来存储该点属于哪一集合,那么所有最开始各自为营,这一操作会使两点分别的集合合并起来,现在用操作1合并2和3。容易发现,如果这两个点的所属集合相同,那么无事发生。现在用操作2查询3处于哪一集合,显然为2集合。有用的东西,让我们看一下模板怎么写吧!现在用操作1合并1和2。现在用操作1合并3和5。现在用操作1合并2和5。
2025-12-25 13:41:33
178
原创 20251201换根DP总结
说白了就是两次 DFS,第一次 DFS 预处理深度,点权和之类的信息,第二次 DFS 开始运行换根动态规划,题目比较简单的都很板。显然目前根结点在原图上的向上子树距离目前根节点的距离+1,其余结点距离目前根节点的距离-1,那么动态转移方程为。假设现在dfs到了1,枚举儿子时找到了2,那么预处理得知。"换根"过程参考图。
2025-12-24 21:58:17
271
原创 20251122树的直径、重心、中心
要确定树的重心,需选择一个根节点使其子树分布尽可能均匀。这里用最大子树的节点数来衡量均匀程度——该数值越小,分布越均匀。因此,使最大子树节点数最小的根节点即为树的重心。树的中心指的是树中某个特殊节点,当以其为根时,能使得从该节点出发的最长路径长度达到最小。定义树上任意两点之间最长的简单路径为树的直径,一棵树可能有很多直径,如菊花图等。以任意节点为根进行DFS遍历,可以计算每个节点的子树规模。树是一种特殊的图,因其看起来像一颗倒挂的树而得名。方法:首先选取任意节点作为根节点,对于每个节点。
2025-12-23 22:32:21
965
原创 20251117Manacher总结
当 i+1 位置位于某个已知回文串(设其中心为 j )的覆盖范围内时,可以借助对称性,取 i+1 关于 j 的对称位置 k 的回文半径作为初始值。否则,i+1 位置的回文半径初始值设为 1 (仅包含自身字符)。我们采用动态规划算法进行求解。假设已经计算出0到 i 位置的回文半径,如何递推求解i+1位置的回文半径?接下来进行边界检查:若 i+1 位置的回文半径仍有扩展空间,则继续向外扩展(需注意时间复杂度控制)。时间复杂度的计算,可以高效确定以每个字符为中心的最大回文半径。入门的题面字数,提高组的内容。
2025-12-23 22:04:54
239
原创 20251103折半搜索总结
折半搜索(又称meet-in-the-middle)是一种优化搜索算法的方法。其说白了就是将搜索过程分成两个部分:先分别对两部分进行独立搜索,得到两个结果序列,最后通过合并这两个序列得到答案。这题就先折半搜索,接着合并时,我们可以先将一部分进行排列使其有序,然后遍历另一部分,每次进行二分搜索查找可行的答案,最后叠加可行方案数。由于搜索算法的时间复杂度通常为指数级,当n较大时容易导致超时。采用折半搜索后,时间复杂度可由。折半搜索模板为何放在放在第三题?
2025-12-23 21:33:23
272
原创 20250927树形DP
简化题意:有 n 个点,他们的从属关系用一颗树来表示,父结点是子结点的直接上司。每个点有一个点权,求拿出若干个点且这若干个点的任意两点无从属关系的最大点权和。依赖型树状DP则表现为兄弟节点状态之间存在制约关系,状态分配需要权衡取舍(如资源分配问题)。独立型树状DP的特点是兄弟节点的状态互不影响,各自独立计算。题意:给定一棵树,n 个点,有边权,至少保留 q 条边,求最大边权和。树形DP是一种在树上的动态规划,利用树的递归特性在树上进行状态转移。表示以 i 为根节点的子树保留至多 j 条边的最大边权和。
2025-12-23 21:06:49
316
原创 20250908区间DP总结
核心操作是将多个子区间合并为一个整体,该过程具有可逆性。表示区间[i,j]的所有元素的权值和,那么。:能够将原问题拆解为可合并的子问题形式。顾名思义,就是在区间里面作区间DP。全班(倒数)第一个交总结的人。该DP用来解决区间最值问题,令。区间DP模板中的模板。
2025-12-23 20:52:56
207
原创 20251214 字典树总结
那么前文提到的"适用于字符串以及字符串前后缀的匹配问题"就显而易见了,从根节点出发,每经过一个节点就在末尾加上该节点上的字母,就可以形成很多字符串的前缀,比如。有时需要标记插入进 trie 的是哪些字符串,每次插入完成时在这个字符串所代表的节点处打上标记即可。题意:给定 m 个字符串,查询 n 次,每次询问字符串 s 是多少串的前缀以及多少串是 s 的前缀。字典树是一种处理字符串匹配的数据结构,适用于字符串以及字符串前后缀的匹配问题。字典树,顾名思义就是一棵树,每一个节点(根节点除外)都代表一个字母。
2025-12-20 10:12:25
362
原创 20251203 完全背包总结
其实现方式与01背包基本一致,唯一的区别是需要从小到大枚举背包容量。从大到小枚举时,较大的背包容量只能由较小的容量更新,且先处理大容量,因此每个物品只会被选取一次。从小到大枚举时,较小的背包容量可以更新较大的容量,且先处理小容量,因此可以实现物品的重复选取。这是一个标准的完全背包模板题,需要注意数据范围较大,应使用long long类型存储。枚举出的四次方数就是物品,重量为它本身,价值为1,求最小价值。首先枚举每一个不超过m的四次方数,然后就是完全背包。时,可获得的最小价值,那么答案为。
2025-12-05 13:30:20
245
原创 20251122 阅读检测
首先,可以初次判断是否不在该图形内,这个图形最大也就一个正方形,边长的一半也就是n,这就意味着如果该点如果在这个图形内的话,横坐标与纵坐标与中心点的距离不会超过n。其次,可以把整个图形看作一个圆形,可以算出斜着的近似半径长度z(这还是人话吗),接着横坐标与纵坐标与中心点的距离和取平均值要小于等于z。直接用两个桶数组统计每个字符的出现次数,最后判断是否相同就行了。用一个map数组来统计每个数出现了多少次,中途可以优化一下。全场最难的题,获得罚时的人数比最后一题还多。Hash,考试的时候差点没想出来。
2025-11-26 21:29:05
209
原创 20251119 01背包总结
首先,我们枚举每一个物品,然后再枚举背包容量,看目前的背包装不装的下这个物品,如果装得下,那么用装这个物品之前剩余的背包的容量的最值加上这个物品的价值更新目前的。上限为体力,背包容量为C,搬木石的体力为物体的重量,体积是价值,目标剩余体力最多,那么消耗体力就要越少,且要完成至少V的价值。由题面可知,背包容量和物品重量是同一种单位,每种物品只有一个,且可选可不选,是01背包。追求剩下体积最小,就是占用体积最大,也就是价值最大。表示当背包容量为 i 是可以获得的最值,那么答案就是。,其中 w 代表背包容量。
2025-11-25 18:11:28
210
原创 20251116 树状DP总结
树形DP是一种基于树结构的动态规划算法,利用树的递归特性进行状态转移。染色为0或1,且子树内叶子合法的最少染色数。
2025-11-22 22:14:12
275
原创 20251115 - 真(Hash) 总结
我从来不写前言,除了这次。这次,由于逆天之我写了7道Hash题,没一道使用Hash算法,且狡猾偷了两个首A,于是有了这篇文章,来讲述怎样(不)用Hash算法做Hash题。
2025-11-19 21:59:13
325
原创 20251109 树状DP总结
第二种,兄弟节点间有相互约束的树状DP,这种树状DP意味着兄弟节点间会互相干扰,就像给这几个兄弟节点分苹果,你分得多一点别人就分的少一点,你分得少一点别人就分的多一点。第一种,兄弟节点间无相互约束的树状DP,这种树状DP意味着兄弟节点之间互不干扰,你干你的,他干他的。树状DP,就是在树上进行动态规划,由于树的特殊递归属性,所以树状DP都是在树上进行的。2.状态:dp[i][j] 表示以 i 为根节点的子树保留至多 j 条边的最大边权和。题意:给定一棵树,n个点,有边权,至少保留q条边,求最大边权和。
2025-11-15 21:42:59
950
原创 20251110 kmp总结
KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,其核心优势在于利用已匹配信息来优化搜索过程。相比暴力匹配算法,KMP通过预处理和智能跳转机制,有效避免了不必要的重复比较。
2025-11-11 17:02:00
316
原创 20251105 线性DP总结
本文介绍了线性动态规划的基本思想和几个经典例题。首先以斐波那契数列为例说明动态规划的核心思想,随后详细讲解了最长上升子序列(B3637)、导弹拦截(NOIP1999)、木棍加工、摆花(NOIP2012)和最佳课题选择等问题的动态规划解法。每种问题都给出了状态定义、转移方程、初始条件和代码实现,特别强调了排序预处理和状态转移的关键技巧。其中导弹拦截问题还证明了"最少不上升子序列数等于最长上升子序列长度"的重要结论。这些例题涵盖了线性动态规划的基本应用场景和解题模式。
2025-11-11 13:26:38
808
原创 20251027 倍增总结
前缀和算法适用于静态区间和查询,通过预处理每个前缀和实现快速计算任意区间和。前缀和的两大局限在于无法处理不可减运算(如区间最值、GCD)和动态修改问题。树状数组支持单点修改和可减区间查询,基于lowbit运算实现。每个节点t[i]存储长度为lowbit(i)的区间和,前缀和可分解为至多。ST表适用于静态可重复贡献问题(如区间最值、GCD),特点是满足x与x运算结果仍为x。实现时需注意预处理对数表优化查询,将指数维度放在外层提高缓存命中率,并正确处理区间边界。个预处理的倍增区间,利用二进制分解实现高效查询。
2025-10-28 18:05:40
313
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅