自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 哈夫曼树<文本压缩>

术语定义节点的权值(weight)赋予节点的数值(本题中 = 字符出现频率)路径长度从根节点到某节点的边的数量(比如根到叶子有 3 条边,路径长度 = 3)带权路径长度(WPL)某节点的权值 × 该节点的路径长度;树的 WPL= 所有叶子节点的带权路径长度之和哈夫曼树给定一组叶子节点的权值,树的 WPL 最小的二叉树(最优二叉树)

2025-12-08 16:45:29 723

原创 虚拟位置映射(标签鸽

类型 1:给定整数 a 和 b(1≤a≤N,1≤b≤N)。将鸽子 a 从当前所在的巢穴中取出,移到巢穴 b 中。将巢穴 a 中的所有鸽子移到巢穴 b 中,同时将巢穴 b 中的所有鸽子移到巢穴 a 中。类型 3:给定整数 a(1≤a≤N)。如果尝试用朴素的方式维护诸如 p2b [i] :=(鸽子 i 当前所在的巢穴编号)这样的信息,那么第二种类型的操作就需要对许多鸽子执行操作,因此很难在时间限制内完成。通过三个数组维护鸽子、标签鸽、巢穴之间的映射关系,避免了类型 2 操作中 “移动所有鸽子” 的耗时操作。

2025-11-08 22:06:51 705

原创 简单无向图DFS

给定一个简单连通无向图,该图包含 N 个顶点(编号从 1 到 N)和 M 条边(编号从 1 到 M)。其中,第 i 条边连接顶点 uᵢ 和 vᵢ,且带有一个权值 wᵢ。在所有从顶点 1 到顶点 N 的简单路径(即不重复经过同一顶点的路径)中,找出路径上所有边的权值进行异或运算后,结果最小的那个异或值。

2025-10-29 20:53:23 291

原创 利用数的变形简化大规模问题#数论

判断是否存在正整数对 (x,y) 满足 x3−y3=N,若存在则输出其中一对,否则输出 -1。N<1e18;核心公式变形:x3−y3=(x−y)(x2+xy+y2)=N由于 x>y≥1,可令 d=x−y(d≥1),则 x=y+d。代入后得:N=d⋅(3y2+3dy+d2)因此,d 必须是 N 的约数,且满足:3y2+3dy+(d2−N/d)=0这是关于 y 的一元二次方程,可通过判别式判断是否存在正整数解。

2025-10-28 21:04:04 209

原创 Fenwick 树进行快速统计

Fenwick 树(二叉索引树)是一种高效的数据结构,主要用于解决和问题,时间复杂度均为O(log n),适用于需要频繁更新元素并查询前缀和的场景(如本题统计满足条件的对数)。

2025-10-22 21:54:10 761

原创 位掩码高效染色二分图

题目:简单图最少删除几条边变成二分图int N, M;i < M;++i) {// 最坏情况需要删除所有边// 尝试所有可能的顶点颜色分配方案(0和1两种颜色)++mask) {// 检查每条边是否连接同色顶点// 转换为0-based索引// 如果两个顶点颜色相同,则这条边需要删除remove++;// 更新最少删除边数return 0;

2025-10-14 20:24:43 637

原创 二进制专项

n & 0n & 1n & n = nn | 1n | n = na ^ a = 0a ^ 0 = an ^ 1~0<<n << kn * 2^k>>n >> kn / 2^kn & maskn | mask位运算符的优先级低于算术运算符(如),但高于逻辑运算符(如&&||&&&&int。

2025-07-18 17:00:55 758

原创 #贪心#最小双端

计算每个阶段从初始亮度到目标亮度需要的顺时针旋转次数,并过滤掉不需要调整的阶段。:尝试所有可能的分割点,计算每种分割方式下两组的最大操作次数之和,并找出最小值。每个点位都需要xy两端二选一,找到最终两端加起来最小的情况。:对需要调整的差异值进行排序。

2025-07-18 14:18:30 282

原创 最大子段和,但是两段# Kadane

【代码】最大子段和,但是两段# Kadane。

2025-07-17 21:35:41 179

原创 Dijkstra 算法求解多种操作

我们发现,路径的选择是非常多种多样的,无法靠人力去完整的思考有哪些可能。(先减 2 次到 5,乘 2 到 10,再减 1 到 9),总花费。需要限制节点范围,否则节点可能无限大(如多次乘 2)。的最优操作序列,使得总花费最小。问题转化为:在该图中寻找从节点。的最短路径,可直接退出循环。(边权为操作花费)。Dijkstra 算法求解。时,加 1 或乘 2 会使。,比直接加 2 次((当前花费, 节点)当队列中取出的节点为。,符合最优路径花费。

2025-07-17 20:25:44 741

原创 二分答案#贪心

【代码】二分答案#贪心。

2025-07-15 21:38:23 442

原创 竞赛常用加速技巧#模板

逐个读取字符,避免了标准输入函数的类型解析和缓冲区开销。对于大规模数据(如百万级整数),这种方式的效率远高于。函数将连续的数字字符手动转换为整数,跳过非数字字符(如空格、换行符),并处理符号位(一般情况,程序会自动内联,可以不用。

2025-07-15 16:59:04 226

原创 树上组合数(树上染色)

树的染色计数问题是组合数学与图论结合的经典问题,其核心思想是利用树的递归结构和乘法原理计算合法的染色方案数目。:如果一个过程可以分解为多个独立步骤,每个步骤有若干种选择,则总方案数为各步骤选择数的乘积。种颜色,要求给每个节点染色,使得相邻节点颜色不同。求满足条件的染色方案总数。:树中任意一条边的两个端点颜色不同。

2025-07-14 13:12:17 486

原创 贪心#贪心的世界

贪心算法是一种在每一步选择中都采取,从而希望导致结果是全局最优的解题策略。它不追求整体最优,而是通过局部最优的累积来试图达到全局最优,适用于具有和的问题。

2025-07-08 21:43:42 785

原创 数位dp()

从高位到低位逐位枚举数字,根据前一位的数字决定当前位可以选的数字(与前一位差的绝对值为 1),同时用记忆化缓存中间结果,避免重复计算。对于本题,我们需要统计所有满足「相邻数字的绝对值差为 1」的数的个数。数位 DP 通常用于统计满足某些条件的数的个数,核心是。内满足条件的数的个数,减去。内满足条件的数的个数,得到。

2025-07-08 15:18:22 280

原创 动态规划-逆向

本题主要考虑倒过来的dp;分散的dp,不维护每一个值,维护每一个初始快乐值。如果前面出现7,那么dp7看dp里是否已经有8,有,则等于dp8+1;如果前面不是7,是5,此时后面没有6,所以5只能自娱自乐,=1。假设后面有89,dp9=1;

2025-07-07 21:47:53 960

原创 欧拉路径(一笔画)模板

/本题可见,每个点一定都是偶数所以必成立。

2025-07-07 20:22:12 443

原创 博弈论基础-笔记

1-3区间,先手比较了一下,如果取10,那么就是把1-2区间给对方差0,最后差10,取1把2-3区间给对方,显然2-3区间差-9,最后-8,取前者。首先,我们发现手里就1个,输,2个,分成11,必赢,3个,只能分成12,对方会选2,4显然分13,5显然必输。这时候,你发现,5-3,不论怎么取,你都会把刚才那些比5-3小的给对方,然后对方反手给你2-1。不确定,但是确实卡住了。-4呢,5-4,你发现可以变成2-1,6-4,你发现可以变成5-3。然后1-4区间,如果取1,把24给对方,差-(-8),最后差9。

2025-07-05 17:13:46 673

原创 LCA(最小祖先)+ST

/ 递推公式//意为,2的k-1次的祖父节点的2的k-1次祖先是该节点2的k祖先。// f[u][k]:节点u的第2^k个祖先。if(dep[f[u][k]]>=dep[v]) // 如果跳跃后仍不低于v。if(f[u][k]^f[v][k]){ // 如果跳跃后不相遇。f[u][0]=fa;// u的第2^0=1个祖先是父节点。u=f[u][k];

2025-07-04 16:23:29 943

原创 分层图最短路(模板)

这一题看似就是一个有权值的最短路问题,但是中间有K次免费,这几次免费会造成非常大的影响,所以我们把原图,复制多份,然后每上下两个图之间,每个点的和另一个图所有与自己本图连通点的对应点有一个权值为0 的路径,比如,12,13连通,就在1与2.2,1与2.3建立两条0权值。跑到2层,就开始在2层与3层跑,一直跑到k+1层,最终终点变成t+n*k。之后就是用dijkstra跑s到t+n*k的最短路了!不会dijkstra或者建图,建议看这里。

2025-07-03 21:42:10 306

原创 图论基础算法入门笔记

单源最短路是固定一个起点,求它到其他点的最短路问题。

2025-07-03 20:04:42 1211

原创 Tarjan 算法的两种用法

uuvvvv。

2025-07-03 20:02:13 698

原创 Dijkstra 算法#图论

【代码】 Dijkstra 算法#图论。

2025-07-03 16:18:31 342

原创 运用逆元优化组合计算#数论

题目要求统计满足特定条件的排列数目。

2025-07-02 20:27:06 375

原创 数论基础知识和模板

单位元:在一个集合中,对于某种运算∗,如果对于任何的集合元素 a,和元素 e 运算,得到还是集合元素 a 本身,则称 e 为这个运算下的单位元。实现就是,对于每个数,我们都将他对整个现在已有的质数表筛一遍,比如3是质数,那么把已有的2相乘,筛掉6,但是并不往下进行,因为比如12,最小质数因数是3,在遍历到4时自然而然就筛掉了,这样每个数就只会被他最小质因数筛掉一次,达到了线性。为了保证逆元是正数,我们把公式调整为 i−1≡(p−k)×r−1(modp),这里的 r 其实就是 p%i。vis[j] = 1;

2025-07-02 20:04:53 916

原创 凸包进阶旋转卡壳(模板题目集)

很明显从一开始,b+1的点一定是要大于b点(0),所以从一开始,b就被推到了i-j的上面,也就是左侧,,,很明显成为了正数;// 找到边 st[i]-st[i+1] 对应的最远点 st[j]//众所周知,叉乘是两向量的对应平行四边形的面积。

2025-07-01 21:13:28 770

原创 凸包提升(还是Andrew)

本题仅需要把每张卡生成4个点即可,最后发现,由于卡圆角圆半径与圆一定相切,那么平移我们围出来的凸包,最后剩下若干个弧;由于2个垂直,减去180度;所以每个点余下两个角是180度,由于多边形的角和等于180*(点数-2);所以余下的圆弧一定是360度,也就是一个圆。}//引入旋转函数,求出根据degree旋转后的x,y值。并且由此处代码进行改写。

2025-07-01 16:03:54 523

原创 Andrew算法(求凸包)

最左下方的点(p1)和最右上方的点(pn)必定是凸包顶点。

2025-07-01 11:49:29 741

原创 带修莫队(三维莫队)

这个数据实时更改,他。。。没法离线!但是,真的没有办法吗,,,带修莫队可以。

2025-06-30 21:51:34 1055

原创 莫队(基础版)优雅的暴力

莫队算法是一种,常用于高效处理区间查询问题。它通过合理排序和移动左右端点来减少时间复杂度。

2025-06-30 21:35:03 1110

原创 离散化(合集-如何使用离散化)

cin>>n;i<n;i++){i<n;return 0;约束:最多1e6x大小:<1e9这里看到x大小1e9,不能直接开fa[],所以要离散化映射到一个小的数组。

2025-06-30 12:08:03 763

原创 AC自动机 多模式字符串匹配(简单版)

题目给定n个模式串和1个文本串,求有模式串在文本串里。注意:是出现过,就是出现多次只算一次。

2025-06-28 21:37:52 866

原创 最长翻转子串(主要讲manachar)

int T;int mx, po;while (T--){//多次输入要求input ();i <= cnt;++i){i >= 1;--i)i <= cnt;return 0;

2025-06-28 16:06:49 949

原创 KMP(最长公共前后缀优化匹配查找)

KMP 算法的 数组是用来快速匹配字符串的,但我们这里只需要它的一个特性: 表示字符串前 个字符中,最长的公共前后缀长度。例子:对于字符串 ,计算 数组:第一步// 构建next数组:计算每个位置的最长公共前后缀长度vector<int> buildNext(const string& s) { int n = s.size(); vector<int> next(n, 0); // 初始化数组,默认值都是0 for (int i = 1; i < n; i++) {

2025-06-28 11:48:06 835

原创 树的重心(双dfs,换根)

/deep数组存储以每个节点为根时的总深度和,point数组存储子树大小。// 每个子节点i的子树中的所有节点到当前节点的距离都要+1,因此增加p[i]// 当根从x变为i时,i的子树中所有节点的深度减少1(距离根更近了)// d[i]是子节点i的子树总深度,p[i]是子节点i的子树大小。// 更新当前节点的子树大小:加上子节点i的子树大小。// 第一次DFS:计算以节点1为根时,每个节点的子树大小和子树总深度。// n-p[i]是除了i的子树外的节点数。// d[x]是以x为根的总深度和。

2025-06-27 21:37:24 837

原创 dp进阶,树形背包(dfs+01)

顾名思义,就是在对树进行搜索的时候,由于限制了子节点选根节点必选和节点数限制,所以需要额外利用背包来维护最大值假设根节点就是0,我们很容易 发现,这就是一个正常的树求和,但是限制了节点数量,所以需要用背包去规划这个限制(容量)局部分析:取一个倒数2小的子节点,可以求出该节点下面选择0-n个子节点的最大值dp[x][i]:x代表该节点的序号,i代表这个节点占多大容量,dp[x][i]自然就是维护的最大值;将其上传,一直到【0】【m】的最大值int n,m;struct ed{

2025-06-27 17:00:33 894

原创 记忆化搜索(dfs+memo)无环有向图

记录从节点 x 出发的所有边的权重之和。根据数学原理,我们很容易发现,一个根(起点)的期望,等于他所有子的期望加上边权和,除边。这样写出来,思路是对的,但是在多条路径下,我们明显可以发现,每个子节点都会计算很多次,所以我们使用记忆化来优化;//如果计算了,直接返回结果。//到达终点,期望为0。//记录从节点 x 出发的所有边的权重之和。for (auto i : a[x]) {//所有子的期望和。//返回时给memo记录。//判断是否被计算过。

2025-06-27 15:52:26 483

原创 状压dp(旅行商问题(TSP))

这是一道典型的二进制状态压缩dp;内容需要3嵌套循环。

2025-06-27 12:01:22 1118

原创 树状dp(dfs)(一道挺基础的)

每个点都有两个状态(1/0),即选或者不选,如果选了,因此我们可以设置 dp[0][i]为点没选之后的最大值。dp[i][1]设置为点选之后的最大值。//先给每个人来的状态设自己为基础开心dp[i][1]+=(dp[0][son])i++)//没有上司就是顶头上司,根。//用来储存树的,一个上司不止1下属,//看看有没有上司的,用来寻找最根的节点,方便遍历。//因为后面遍历加直系下属,所以先把这个加一次的提前加好;son[x] = 1;

2025-06-27 10:36:35 288

原创 *背包问题变种加动态存储路径(就是背包里是哪几个东西)

在遥远的国家弗罗尼亚,法庭审判的裁决由一个由普通民众组成的陪审团决定。每次审判即将开始时,都需要挑选一个陪审团,挑选方式如下。首先,从民众中随机抽取几个人。对于这个候选池中的每个人,辩护方和起诉方会给出一个 0 到 20 的分数,表示他们对该人的偏好。0 表示完全不喜欢,20 则表示认为此人非常适合担任陪审团成员。法官会根据双方给出的分数来挑选陪审团。为了确保审判公平,陪审团倾向于偏袒辩护方或起诉方的程度应尽可能平衡。因此,必须以一种让双方都满意的方式挑选陪审团。

2025-06-26 22:02:13 696

空空如也

空空如也

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

TA关注的人

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