- 博客(22)
- 收藏
- 关注
原创 位运算基础与进阶
原理:负数在计算机中以补码存储(反码 + 1),相与后只保留最右边的 1。应用:这是树状数组(Binary Indexed Tree)的核心。在解决动态规划(DP)或搜索问题时,常用一个。原理:2 的幂次二进制只有一个 1,会让该位变 0 且低位全变 1。(表示 $n$ 个位置全是 1)。),此方法会让变量变为 0。指向同一个内存地址(即。(结果为 0 或 1)。,位数从 0 开始。
2026-04-27 17:33:34
51
原创 算法题解笔记:[洛谷 P1113] 杂务
拓扑排序是针对**有向无环图(DAG)**的一种排序算法。用最通俗的话来说:它就是把一堆错综复杂的“前置任务”和“后续任务”,整理成一个绝对合法的、线性的执行顺序直观理解:排课表、技能树点亮顺序、工程流水线安装。拓扑排序的通用算法 (Kahn算法)统计所有节点的入度(有多少条边指向它)。将所有入度为 0(无前置依赖)的节点放入队列。取出队首节点,将其加入结果序列,并将该节点指向的所有后续节点的入度减 1。如果某个后续节点入度变为 0,将其加入队列。重复直到队列为空。本质模型:这是一个在。
2026-03-03 11:47:27
658
原创 程序设计实习C++部分笔记
类(class)是对一类对象的抽象描述,用来封装数据(成员变量/属性)和操作这些数据的方法(成员函数/行为)。类是类型,对象是类的实例。面向对象三大特性:封装、继承、多态1.3 对象的实例化与使用访问成员:用 “ 运算符。类内定义:类外定义,使用作用域:二、构造函数和析构函数2.1 一般构造函数类中的成员变量一般都会进行私有化,即在 访问控制符下创建,而变量的初始化一般是在构造函数中进行。2.2 初始化列表初始化列表可以简化构造函数的写法。2.
2026-03-02 14:36:51
899
原创 C++并查集
并查集是一种树形的数据结构,主要用于处理一些不相交集合的合并及查询问题。查询 (Find):确定某个元素属于哪个子集。它可以用来判断两个元素是否在同一个集合里(比如:你和他是同一个圈子的吗?合并 (Union):将两个子集合并成一个集合(比如:两个本来不认识的圈子,因为两个人的认识而连在了一起)。
2026-03-01 14:42:15
362
原创 算法笔记:洛谷 P1108 低价购买
fif[i]fi:以第iii天价格结尾的最长下降子序列长度。tit[i]ti:以第iii天价格结尾且长度为fif[i]fi的不同方案总数。
2026-02-24 20:12:37
910
原创 动态规划——删除k个求最值/选特定长度的最佳子序列
这是一种“通过枚举上一个状态”来消除后效性的动态规划(DP)思想。本书是必须保留的最小不整齐度。,我们需要枚举上一本被保留的书。
2026-02-13 21:48:09
1018
原创 Markdown基础语法
GitHub 在标准 Markdown 基础上增加了一些特有功能,称为。:直接粘贴 URL,GitHub 会自动将其转为可点击的链接。可以直接链接到仓库中编号为 12 的任务单(Issue)。代表二级标题,以此类推(最多支持六级)。可以直接提醒对应的 GitHub 成员。,可以打开侧边实时同步预览,一边写一边看。开头,通常用于标注警告、提示或说明。(在 GitHub 上非常实用)。cpp),即可实现语法高亮。)即可在当前窗口查看预览。:输入三个以上的减号。包围,并注明语言(如。
2026-02-07 23:37:59
226
原创 C++基础语法笔记
支持容器:vector, deque, string, array, list。所有成员共享起始地址,内存对齐(大小取最大成员的整数倍)。生命周期贯穿整个程序,仅初始化一次,存储在静态区。绝对不能返回局部变量的引用(会导致悬空引用)。全局变量、静态变量 (static)、常量。定长数组,无法自动初始化,必须手动初始化。节省内存,通过不同视角解析同一段内存。无返回值,名字必须与类/结构体相同。(自动保留 6 位小数,不灵活)(首选,支持大部分连续内存容器)必须初始化,一旦绑定不可更改。对象创建时自动初始化。
2026-02-06 20:33:45
540
原创 多策略最优决策问题
再用“基础策略”去修正每一秒的状态。因为基础策略不消耗资源,它是保底收益。:先只考虑“最强策略”及其配套的“资源恢复”方案,更新一遍最优解数组。:通常存在两种或多种移动/操作方式(如:平放、爆发技能、资源恢复)。:操作之间共用一种或多种资源(如:时间、魔法值、体力)。:必须在规定的时间内(或步数内)达到目标。另一种(跑步),但受到资源(蓝量)限制。
2026-02-04 20:34:23
191
原创 C++作业调度问题
从 start_from 开始向后遍历,直到连续 cost 个时间点对应的机器都处于空闲。这类题目最容易掉入“按时间一分钟一分钟模拟”的陷阱(你第一版代码的问题)。T_start >= 该工件前一道工序的结束时间 + 1。时间轴长度通常开到 10000 以上以防溢出。按照题目给出的优先顺序,依次为每个任务寻找。记录机器在某一时刻是否被占用。:记录该工件上一次工序何时结束。:记录该工件目前该做第几个工序。
2026-01-29 23:01:04
169
原创 C++二分细节敲定规则
因为左界为开,遇到可取值时始终以该值为新的左界,故左界一直代表可取值;反之,若求最小值,返回。时终止,返回什么根据求最大值或最小值而定,若求最大值,返回。时终止,返回什么根据求最大值或最小值而定,若求最大值,返回。,因为右界始终是可取值;反之,若求最小值,返回。
2026-01-26 21:59:15
38
原创 C++卷积&&截断卷积
朴素卷积其实等同普通高精度算法,时间复杂度均为O(m*n),之所以当运算量很庞大时采用卷积而非普通高精度,是因为卷积可以通过分块从而使 m 和 n 表示块数而不再是位数。只计算卷积结果中“我关心的那一部分”,其余部分在计算过程中直接丢弃,如乘法结果只取最低 K 位。,以至于高精度计算会超时,就应采用卷积。
2026-01-20 19:07:06
337
原创 C++动态规划——一维 k-median(邮局问题)
left = (pos[mid]+pos[mid]+…)−(pos[l]+pos[l+1]+…),利用前缀和即可以O(1)计算cost[l][r],最终以O(m。区间含点数为偶数时,建在 (l+r)/2~(l+r)/2+1 保证距离和最小;解释:cost[l][r] = left + right,以 left 为例,cost[l][r] 表示在区间[l,r]上只建一个设施时的最小距离和。状态定义:dp[i][j] = 前 i 个点,建 j 个设施的最小距离和。得到pos[m+1]坐标数组。
2025-12-31 12:26:00
342
原创 C++求最长回文子串——Manacher(马拉车)算法
p[i] 表示:以 i 为中心,向左右能扩展的最大半径,即为去掉填充字符后回文串的长度。所有回文长度统一为“奇数”;回文中心永远是一个字符;始末特殊字符避免扩展时超出边界。求最长回文子串(长度),数据规模超大时唯一可行的O(n)算法。,避免重复扩展,从而把所有扩展操作压缩到 O(n)。right :该回文能覆盖到的最右端位置。最长回文子串长度 = max(p[i])center:当前最右回文的中心。③ 尝试继续向两边扩展。② 初始化 p[i]
2025-12-23 18:17:46
390
原创 C++分治思想
分治(Divide and Conquer) 是一种常用的算法设计思想,其核心理念是将一个复杂的问题。将大图视作由k个自相似的小图拼成,本质是“画布”的拆分----定位画布的左上角。逆序对是在归并排序的基础上进行:当两个子数组合并时,,逐一解决子问题后,再将结果合并,得到原问题的解。当k为偶数,S(k)=S(k/2)*(1+A。当k为奇数,S(k)=S(k-1)+A。且排序与计算逆序对数同时进行。求 S(k)=A+A。2.逆序对&归并排序。
2025-12-19 19:01:32
167
原创 C++算法:连续时间+多任务并行(二分)
把炸锅看成一个“资源池”:每 1 秒,炸锅消耗 k 单位工作量,第 i 个鸡排最多能提供 t[i] 单位工作量,在 T 秒内,第 i 个鸡排最多贡献。有 n 个任务(鸡排),第 i 个任务需要 t[i] 的总处理时间,同时最多(且必须)处理 k 个任务,任务可随时切换,但完成的任务不能再占用资源。浮点数二分:当答案为浮点数时,二分终止条件不再是left>right,而是用一个较大的二分次数来限制。左边:所有鸡排在 T 秒内最多能提供的炸制时间。右边:炸锅在 T 秒内必须消耗的炸制时间。
2025-12-17 19:59:47
372
原创 C++连续自然数和
连续区间长度设为 k(至少为 2),起点为 L,则:L+(L+1)+⋯+(L+k−1)=M;求和公式:kL+2k(k−1)=M;化简:L=[M−2k(k−1)]/k;因此对所有 k 从 2 开始枚举,一直到2k(k-1)>=M进行剪枝即可。
2025-12-10 19:05:36
296
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅