07 2024 档案
摘要:倍增 倍增是与二分相反的算法,其核心思想是每次扩大一倍,以 2 n 2^n 2n的速度极大扩展空间 原理:任意整数均可被分解为若干个以2为底的幂项和。最经典的倍增是 2 i 2^i 2i(实际应为 e i e^i ei) 流程:定义倍增表 g [ i ] [ j ] g[i][j] g[i][j],
阅读全文
摘要:拓扑排序 拓扑排序可视为对图上所有顶点不重不漏的遍历,因此可采用BFS或DFS实现 拓扑排序的充要条件是其为DAG(有向无环图),若拓扑排序无解说明图该图不是DAG,因此可对图进行判环 若为无向图可看做有向图进行拓扑排序(基环树) 复杂度: O {O} O( V + E V+E V+E) 基于BFS
阅读全文
摘要:Bellman-Ford 本质:DP,对边进行操作特点:单源最短路,求解一个源点到其他所有点的最短距离适用对象:小图,允许负权有向图,不能处理负权无向图和和负环图(负环:图上边权之和为负的环)存储结构:直接存边核心思想:每轮中反复松弛所有边,若该边使距离更优则更新。最多进行 V − 1 V-1 V−
阅读全文
摘要:Floyd 本质:DP 存储结构:邻接矩阵,若有重边则读入时必须取最小边 算法特点:多源最短路,能一次性求解所有点对间的最短距离 适用对象:小图,允许负权图,无法适用于负环图(负环:环上边权之和为负的环,当任意时刻出现 d p [ i ] [ i ] < 0 dp[i][i]<0 dp[i][i]<
阅读全文
摘要:Dijkstra 本质:BFS+贪心,对点进行操作 特点:单源最短路,求解一个源点到其他所有点的最短距离 存储结构:链式前向星 适用对象:非负权图(一旦顶点已经确定最短路,其将不再被考查, d i s dis dis将不再改变);不能求最长路 核心思想:不断贪心选取 { d i s } \set{d
阅读全文
摘要:离散化 离散化适用于在一个较大区间内,只关心数据的相对大小,而不关心数据的绝对大小,通常将较大的区间通过映射缩小到一个较小区间中,用相对值代替绝对值,进行缩小区间范围的技巧,以提升时空效率。哈希表本质上就是利用了离散化的思想。 离散化只是一个思想,实际上并没有规定如何进行离散化。离散化的可行方式有:
阅读全文
摘要:最长公共子序列(LCS) 给出两序列 v 1 , v 2 v1,v2 v1,v2,求它们最长公共子序列长度(子序列可以不连续) 长度问题 DP( O ( n 2 ) O(n^2) O(n2)) 闫氏DP分析法 注: v 1 , v 2 v1,v2 v1,v2下标从 0 0 0开始, d p dp d
阅读全文
摘要:Raicom CAIP系列比赛历年真题均在PTA教育超市售卖。本场比赛真题售卖链接入口 RC-u1 热҈热҈热҈ 分数 10 热҈热҈热҈……最近热得打的字都出汗了! 幸好某连锁餐厅开启了气温大于等于 35 度即可获得一杯免费雪碧的活动。但不知为何,在每个星期四的时候,这个活动会暂停一天…… 现在给
阅读全文
摘要:完全背包 背包容量为 V V V,有 n n n种物品,每种物品有无限多个,第 i i i种物品体积为 c i c_i ci,价值为 w i w_i wi,怎样装填背包使总价值最大? 实际上,完全背包并不代表每种物品可以真正装填“无限”多个,因为存在背包总体积这一限制因素。 分析:闫氏DP分析法
阅读全文
摘要:群友的问题 快速幂 关键在于拆分 2 22 = 2 16 + 4 + 2 = 2 16 × 2 4 × 2 2 2^{22}=2^{16+4+2}=2^{16} \times 2^4 \times 2^2 222=216+4+2=216×24×22 10进制快速幂: 高精次幂的解决方案 数论基础 取
阅读全文
摘要:快速幂 分治法((指数折半法, O ( log 2 n ) O(\log_2 n) O(log2n)) 思想:不断 n ≫ 1 n\gg1 n≫1,每次将指数折半计算 例: a 4 = ( ( a ) 2 ) 2 a^4=((a)^2)^2 a4=((a)2)2, a 5 = ( a 2 ∗
阅读全文
摘要:0/1背包 背包问题是DP最经典的类型之一,而0/1背包是最经典最基础的背包问题。 背包体积为 V V V, n n n种物品,每种物品只有1个,第 i i i种物品对应体积为 c i c_i ci,价值为 w i w_i wi,怎样装填能使背包总价值最大? 由于每件物品只有选(0)与不选(1)
阅读全文
摘要:最长上升子序列(最长递增子序列,LIS) 长度问题 给定长度为 n n n的序列 v v v,求此序列中严格递增(上升)的子序列长度最大值(子序列可由原序列中不连续的元素构成) 朴素DP( O ( n 2 ) O(n^2) O(n2)) 闫氏DP分析法 状态表示: 集合 d p dp dp:所有满足
阅读全文
摘要:数字三角形 题源:POJ 1163 递推(dp) 自底向上递推,先计算最后一行,最后一行就是逐行向上转移 转移方程式: d p [ j ] [ i ] = m [ j ] [ i ] + m a x ( d p [ j + 1 ] [ i ] , d p [ j + 1 ] [ i + 1 ] )
阅读全文
摘要:北湖的繁华 北湖的繁华 北湖的繁华 终究 终究 终究 还是不属于我了 还是不属于我了 还是不属于我了 永远铭记 6 月 26 日 永远铭记6月26日 永远铭记6月26日 在这天下午 , 一个眼镜男夺走了我的资格 在这天下午,一个眼镜男夺走了我的资格 在这天下午,一个眼镜男夺走了我的资格 永远不会忘记
阅读全文
摘要:最大子段和问题 给出一个长度为 n n n 的序列 a a a,选出其中连续且非空的一段使得这段和最大。 分治法( O ( n log n ) O(n\log n) O(nlogn)) 设区间 [ l , r ] [l,r] [l,r]中点为 m i d mid mid,最大子段和为 [ i ,
阅读全文
摘要:一道很简单的dp题,但本蒟蒻被坑的很惨,发布题解作为警示 坑点: 本题无法用机器人走方格直接套出,不能对首行首列进行初始化,因为本题有障碍物dp时必须对原点进行特判防止原点被转移为0不开long long见祖宗 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:本题为拓扑排序板子题,但本蒟蒻耍无赖,巧妙的用dp转移的思想做出来了,发一篇题解纪念一下 #include<bits/stdc++.h> using namespace std; using ll=long long; int t; const int MAX=1e4+10; struct node
阅读全文
摘要:根号分块 分块是一种借助了线段树的序列区间化+懒标记的思想。 区间序列化:将序列分为若干个等长的块,每一块有一段管理区间,用于存储该区间的某些信息,如区间之和、区间之积、可重复贡献性问题(区间最值、区间GCD)等。 设序列长度为 n n n,块长为 b b b,则可分为 n b \frac{n}{b
阅读全文
摘要:滑动窗口法,暂时没有思路,先存一篇题解,有时间回来看 #include<bits/stdc++.h> using namespace std; using ll=long long; int n,m; const int MAX=2e5+10; vector<int>v(MAX),f(MAX);//
阅读全文
摘要:单调栈水题,强烈建议本题降黄 #include<bits/stdc++.h> using namespace std; using ll=long long; using tiiii=tuple<int,int,int,int,int>;//height index data ans vector<
阅读全文
摘要:哈希 key->value,借助离散化的思想对数据进行映射,可视为用value代表原本的key 在C++中,可使用map当做哈希表使用,将std::hash当做哈希函数使用 hash<Typename>name; size_t value=name(key); 数字哈希 哈希函数的设计 方法:直接定
阅读全文
摘要:字典树(Tire树) 字典树是一种多叉树,又称前缀树。核心思想是利用字符串的公共前缀。 字典树本质是一个森林,通过空的根节点转换成有根树便于研究;从根节点到某一节点路径上的字符连接起来构成完整字符串,完整字符串是由一条链构成;一个节点的所有子节点都具有相同公共前缀。 普通Tire树 struct n
阅读全文
摘要:本小蒟蒻看到貌似没有人用C++11的std::hash,在此发(shui)一篇题解 #include<bits/stdc++.h> using namespace std; using ll=long long; const int MAX=1e4+10; hash<string> hash_s;
阅读全文
摘要:树状数组(二叉索引树) 树状数组的核心思想:分治。将数组以二叉树的逻辑结构进行组织。树状数组巧妙的利用了下标的二进制特性,以维护区间信息。 树状数组并非一棵真正的二叉树,以二叉树的存储结构进行组织的为线段树。 lowbit \texttt{lowbit} lowbit操作:获取整数最低位的1的位置。
阅读全文
摘要:BFS板子题,但有坑点需要注意,以此纪念一下本人发生双重事故之后的第一道题。 #include<bits/stdc++.h> using namespace std; const int MAX=300+10; struct node{ int x,y,t; bool v; }m[MAX][MAX]
阅读全文