随笔分类 -  Algorithm

摘要:定义 对于数组 A[n],它的差分数组为: \[diff[i]=\begin{cases} A[i],&i==0 \\ A[i]-A[i-1],&0<i<n \end{cases}\]显然,通过差分数组 diff[n],可以求得 A[n] 中的某一具体元素: \[A[i]=\begin{cases} 阅读全文
posted @ 2024-03-28 19:09 ltign 阅读(12) 评论(0) 推荐(0) 编辑
摘要:一、问题描述 P1020 [NOIP1999 提高组] 导弹拦截 二、问题简析 该题要我们求两个问题: 1、不上升子序列的最大长度 2、不上升子序列的最少个数 利用 \(Dilworth\) 定理,我们得到不上升子序列的最少个数等于上升子序列的最大长度。 现在,就是求这两个问题: 1、不上升子序列的 阅读全文
posted @ 2024-03-24 20:26 ltign 阅读(16) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 B3637 最长上升子序列 二、问题简析 2.1 法一:\(O(N^2)\) 令 \(dp[i]=\) 以 \(a_i\) 结尾的上升子序列的最大长度。 以 \(a_i\) 结尾的上升子序列有两种可能: 1、仅有 \(a_i\) 一个元素 2、在满足 \(j < i\) 且 \(a_j 阅读全文
posted @ 2024-03-24 20:07 ltign 阅读(19) 评论(0) 推荐(0) 编辑
摘要:一、拓展欧几里得算法 1.1 算法简析 根据裴蜀定理,对任意 \(a\) 和 \(b\),一定存在 \(x\) 和 \(y\),使 \(ax + by = \text{gcd}(a, b)\)。拓展欧几里得算法不仅能求出 \(a\) 和 \(b\) 的最大公约数,而且能找到一对 \((x, y)\) 阅读全文
posted @ 2024-03-13 15:31 ltign 阅读(20) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 P8683 [蓝桥杯 2019 省 B] 后缀表达式 二、算法简析 显然,这道题要用贪心思想。想当然的,我们会先进行降序排序,将大的相加,在减去小的。然而,这种想法是错误的。因为这道题要求的是后缀表达式的最大值,为了便于理解,我们转换为中缀表达式的最大值,这里就有了一个隐含条件——中缀 阅读全文
posted @ 2024-02-26 22:24 ltign 阅读(29) 评论(0) 推荐(0) 编辑
摘要:一、简析前缀和 有一系列元素 \(A[a_0,~a_1,~...,~a_n,~...]\),前缀和 \(pre\_sum[n]=A[0]+A[1]+···+A[n]\)。 利用前缀和,我们可以很高效地得到 \([L,~R]\) 的区间和 \(\sum_{i=L}^{R}A[i]=pre\_sum[R 阅读全文
posted @ 2024-02-25 19:51 ltign 阅读(9) 评论(0) 推荐(0) 编辑
摘要:一、单源最短路径 typedef long long ll; const int MAX = 2e3 + 5; const ll INF = numeric_limits<ll>::max(); typedef struct { int to, worth; } edge; int n, m; ve 阅读全文
posted @ 2024-02-25 18:41 ltign 阅读(7) 评论(0) 推荐(0) 编辑
摘要:一、问题简述 有一棵 \(n\) 个节点组成的树,每个节点 \(a_i\) 有一个权值 \(a_i.worth\)。求子树的点权值和的最大值。 二、算法简析 该问题要用树形dp求解。 设 \(dp[u] =\) 以 \(u\) 为根节点的子树的点权值和的最大值。我们采用邻接表的形式存储边,\(G[u 阅读全文
posted @ 2024-02-25 14:38 ltign 阅读(9) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 P8741 [蓝桥杯 2021 省 B] 试题 C :直线 二、算法简析 设两点 \(P_1(x_1, y_1)\) 和 \(P_2(x_2, y_2)\)。 斜率为: \[k = \frac{y_2 - y_1}{x_2 - x_1} \] 斜截式为: \[\begin{split} 阅读全文
posted @ 2024-02-20 14:24 ltign 阅读(10) 评论(0) 推荐(0) 编辑
摘要:一、算法原理 我们不直接比较字符串 \(S\) 的字串和模式串 \(T\) 是否相等,而是比较二者的哈希值。 设字符串 \(S\) 的长度为 \(l\),字符串 \(T\) 的长度为 \(m\)。 取两个互素的常数 \(b\) 和 \(h\) (\(l < b < h\)),设字符串 \(C = c 阅读全文
posted @ 2024-02-18 19:56 ltign 阅读(105) 评论(0) 推荐(0) 编辑
摘要:一、预处理组合数 核心: \[C_a^b = C_{a-1}^b + C_{a-1}^{b-1} \]适用范围:\(a\) 较小的情况下,如 \(a \leq 10^3\)。 算法简析:令 \(\text{C[n][k]}=C_n^k\),规定 \(\text{C[0][0] = 1}\),则 \[ 阅读全文
posted @ 2024-02-16 19:36 ltign 阅读(26) 评论(0) 推荐(0) 编辑
摘要:法一:运用位运算简化计算 以 \(3^{22}\) 为例,它的底数为 \(3\),指数为 \(22\)。指数的二进制形式为 10110。通过二进制与十进制的转换,我们可以把 \(22\) 分解为 \(22 = 2^4 * 2^2 * 2^1\)。因此,\(3^{22} = 3^{2^4} * 3^{ 阅读全文
posted @ 2024-02-15 14:48 ltign 阅读(11) 评论(0) 推荐(0) 编辑
摘要:一、模运算的定义 对于 \(\forall~a\in \mathbb{R},~m \in (0, +\infty)\),求 \(a\) 除以 \(m\) 的余数的运算,就是取模运算,记作 \(a~mod~m\)。 规定 \(0 \leq a~mod~m \leq m - 1\)。若 \(a\) 为负 阅读全文
posted @ 2024-02-12 14:11 ltign 阅读(63) 评论(0) 推荐(0) 编辑
摘要:一、素性判断 素数,又叫质数,是指一个整数,除了1和本身之外,还有其它的因数(注意:1不是素数)。因此,对于一个整数 \(n\),我们只要检测 \([2, n - 1]\) 能否整除 \(n\)。 整除的定义:\(\exist\) \(a, b, k \in \mathbb{Z}\),使得 \(a 阅读全文
posted @ 2024-02-12 13:03 ltign 阅读(49) 评论(0) 推荐(0) 编辑
摘要:一、问题描述 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 二、问题简析 2.1 最大公约数 求两个正整数的最大公约数gcd (greatest common divisor),最常用的方法是辗转相除法。 // 求a和b的最大公约数 int gcd(int a, int b) 阅读全文
posted @ 2024-02-09 16:36 ltign 阅读(32) 评论(0) 推荐(0) 编辑
摘要:一、问题描述 B3611 【模板】传递闭包 二、问题简析 首先,要弄清楚传递闭包的定义,由题意: 一张图的邻接矩阵定义为一个 \(n\times n\) 的矩阵 \(A=(a_{ij})_{n\times n}\),其中 \[ a_{ij}=\left\{ \begin{aligned} 1,i\ 阅读全文
posted @ 2024-02-08 21:01 ltign 阅读(85) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 P5960 【模板】差分约束 二、题目简析 差分约束问题的典型特征是一组不等式。只要画出约束图,这类问题都可以准换为最短路径问题。注意:约束图是有向图。 2.1 约束图的顶点 约束图的顶点(\(V\)) = 一个未知数对应一个顶点(\(v_1, v_2, ...,v_n\)) + 一个 阅读全文
posted @ 2024-02-08 16:23 ltign 阅读(12) 评论(0) 推荐(0) 编辑
摘要:一、问题描述 P2865 [USACO06NOV] Roadblocks G 二、问题简析 如果求最短路径,我们很自然会想到 \(Dijkstra\)。但是,这道题要求的是次短路径。 记到 \(u\) 的最短路径为 \(d_1[u]\),到 \(u\) 的次短路径为 \(d_2[u]\)。则 \(d 阅读全文
posted @ 2024-02-06 17:02 ltign 阅读(13) 评论(0) 推荐(0) 编辑
摘要:问题描述 有一张 \(n\) 个顶点、\(m\) 条边的无向图,且是连通图,求最小生成树。 算法简析 \(Kruskal\) 是一种求最小生成树的算法。 设该图为 \(G = (V, E)\)。最小生成树即所求为 \(G_T = (V_T, E_T)\),因为图是连通的,所以最小生成树会覆盖所有的顶 阅读全文
posted @ 2024-02-06 14:16 ltign 阅读(11) 评论(0) 推荐(0) 编辑
摘要:一、并查集的概念 并查集是一种管理元素分组情况的数据结构,主要实现以下两个功能: 查询元素 \(a\) 和 \(b\) 是否在同一集合 合并元素 \(a\) 和 \(b\) 所在的集合 注:并查集只能进行合并操作,不能进行分割操作。 二、并查集的实现 一般,我们采用数组 par[] 和 height 阅读全文
posted @ 2024-02-06 14:16 ltign 阅读(17) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示