
算法
文章平均质量分 85
正月看飞雪
这个作者很懒,什么都没留下…
展开
-
ACM信息学竞赛算法总结
基础知识位运算递推与递归前缀与差分二分排序倍增贪心尺取法数据结构栈与队列 : 单调栈 单调队列 双端队列Hash: 字符串Hash 与Hash表字符串处理: KMP算法,-- Rabin-Karp 算法 — 最小表示法Tire(字典树)AC自动机二叉堆并查集树状数组线段树分块拓扑排序点分治离线分治算法二叉查找树与二叉平衡树可持久化数据结...原创 2020-02-02 16:10:11 · 3206 阅读 · 2 评论 -
最近公共祖先(LCA) 向上标记法 & 树上倍增法 & Tarjan算法
求最近公共祖先的算法一.向上标记法从x向上走到根节点, 并标记路径上经过的点从y向上走到根节点, 当遇到第一个被标记的点就找到了LCA(x, y)二.树上倍增发时间复杂度: O(mlogn) 用 f[x, k] 表示x向上走2^k到达的节点, 很容易知道 , f[x, 0] 就是x的父节点, 递推关系就是, f[x, k] = f[ f[x, k - 1], k - 1] 用depth[x], 存.原创 2020-05-10 17:12:47 · 731 阅读 · 1 评论 -
差分约束
可以得到解的前提: 我们建立的虚拟原点必须可以到达所以的节点求最小值: 我们用spfa求最远距离, 不等式用 >= 符号, 存在正环无解求最大值: 我们用spfa求最短距离, 不等式用 <= 符号, 存在负环无解...原创 2020-05-09 12:48:18 · 194 阅读 · 0 评论 -
质数的判定与筛选:朴素筛选 Eratosthenes筛法 线性筛法 以及 质因数的分解
一. 质数的筛选朴素筛选 : 试除法若一个正整数N为合数,则存在一个能 整除 N 的 T , 其中 2 <= T <= sqrt(N) 根据上述命题,我们只需要扫描2~sqrt(N)之间的所有整数,依次检查它们能否整除N.若都不能整除,则N是质数,否则N是合数。试除法的时间复杂度为0(sqrt...原创 2020-02-02 14:33:54 · 586 阅读 · 0 评论 -
动态规划:线性DP
线性DP定义 线性DP:即线性动态规划,不局限于“线性时间复杂度”的一维动态规划。与数学中的“线性空间”类似,如果一个动态规划算法的“状态”包含多个维度,但在每个维度上都具有“线性”变化的“阶段”,那么该动态规划算法同样称为“线性DP"。在这类问题中,需要计算的对象表现出明显的维度以及有序性,每个状态的求解...原创 2020-02-05 14:18:42 · 456 阅读 · 0 评论 -
POJ - 2279 Mr. Young's Picture Permutations 线性DP + 5维DP
问题描述有 N 个学生合影,站成左端对齐的 k 排,每排分别有 N1,N2,…,Nk 个人。 (N1≥N2≥…≥Nk)第1排站在最后边,第 k 排站在最前边。学生的身高互不相同,把他们从高到底依次标记为 1,2,…,N。在合影时要求每一排从左到右身高递减,每一列从后到前身高也递减。问一共有多少种安排合影位置的方案?下面的一排三角矩阵给出了当 N=6,k=3,N1=3,N2=2,N3=1...原创 2020-02-03 19:36:24 · 615 阅读 · 0 评论 -
数论:欧几里得算法;欧几里得扩展式;欧拉函数, 欧拉筛选;积性函数;费马小定理;欧拉定理;欧拉定理的推论;线性同余方程;中国剩余定理
欧几里得算法 对任意整数a, b 并且 b不等于0, 有 gcd(a, b) = gcd(b, a % b)代码int gcd(int a, int b){ return b ? gcd(b, a % b) : a;}朴素写法int gcd(int a, int b){ if(b == 0)...原创 2020-02-03 16:19:35 · 609 阅读 · 0 评论 -
博弈论 Nim游戏 Staircase Nim阶梯尼姆 POJ 1704 Georgia and Bob
Nim游戏 给定n堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选-一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手能否必胜。定理NIM博弈先手必胜,当且仅当 A1 xorA2xor … xorAn ≠ 0。Staircase N...原创 2020-02-03 13:03:10 · 2872 阅读 · 0 评论 -
估计函数与迭代加深相结合:IDA*算法
定义IDA* 算法就是基于迭代加深的A*算法。 A*算法的关键在于设计估价函数。既然估价函数与优先队列BFS结合可以产生A"算法,那么估价函数能否与DFS结合呢?当然,DFS也有一个缺点,就是一旦估价出现失误,容易向下递归深入一个不能产生最优解的分支,浪费许多时间。因此,我们最终选择把估价函数与迭代加深的D...原创 2020-02-01 18:43:56 · 517 阅读 · 0 评论 -
启发式搜索:A*算法
定义 A*算法,(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。推理 如果给定一个“目标状态”, 需要求出从初...原创 2020-02-01 12:34:26 · 980 阅读 · 0 评论 -
搜索优化技巧:双向搜索
双向搜索 除了迭代加深之外,双向搜索也可以避免在深层子树上浪费时间。在一些题目 中,问题不但具有“初态”, 还具有明确的“终态”,并且从初态开始搜索与从终态开始逆向搜索产生的搜索树都能覆盖整个状态空间。在这种情况下,就可以采用双向搜索一从初态和终态出发各搜索一半状态, 产生两棵深度减半的搜索树,在中间交会、组合...原创 2020-01-30 15:35:30 · 1520 阅读 · 0 评论 -
搜索优化技巧:迭代加深
迭代加深 深度优先搜索每次选取一个分支,进行一条路走到黑的搜索,一直到递归的边界才回溯,这样会存在一个缺陷。如果搜索树的分支数目特别多,但是问题的答案在比较浅的一个节点上,那么会做很多无用功,浪费很多时间。 如图如过用深度优先的话...原创 2020-01-30 12:45:04 · 602 阅读 · 0 评论 -
搜索优化技巧:剪枝
定义 剪枝, 就是减少搜索规模, 尽早排除不可能的选项,和一定不会成为最优解的选项,形象的说就好像剪掉了搜索树的枝,所以叫做剪枝。剪枝的常用方法优化搜索顺序 在一些搜索问题中,搜索树的各个层次, 各个分支之间的顺序不...原创 2020-01-29 16:50:16 · 1112 阅读 · 0 评论 -
C++ STL模板库 bitset
bitset简介 bitset可看作一一个多位二进制数,每8位占用1个字节,相当于采用了状态压缩的二进制数组,并支持基本的位运算。在估算程序运行的时间时,我们一般以32位整数的运算次数为基准,因此n位bitset执行一次位运算的复杂度可视为 n/32, 效率较高。用法bitset<100>...原创 2020-01-25 13:16:13 · 344 阅读 · 0 评论 -
数据结构基础【Trie(字典树)】
Trie定义: Trie (字典树)是一种用于实现字符串快速检索的多叉树结构。Trie的每个节点都拥有若于个字符指针,若在插入或检索字符串时扫描到一个字符c, 就沿着当前节点的C字符指针,走向该指针指向的节点。初始化 ...原创 2020-01-21 15:14:26 · 366 阅读 · 0 评论 -
数据结构基础【最小表示法】
最小表示法定义 给定一个字符串S[1~n], 如果我们不断把它的最后一一个字符放到开头, 最终会得到n个字符串,称这n个字符串是循环同构的。这些字符串中字典序最小的一个,称为字符串S的最小表示。朴素法不过多阐述,这里介绍一种O(n)时间复杂度的方法。S = “bacacabc”, i=2, j=4...原创 2020-01-21 11:29:49 · 379 阅读 · 0 评论 -
数据结构基础【字符串Hash】
字符串Hash取一固定值P,把字符串看作P进制数,并分配一个大于0的数值,代表每种字符。一般般来说,我们分配的数值都远小于P。例如,对于小写字母构成的字符串,可以令a = 1,b = 2, z = 26。取一固定值M,求出该P进制数对M的余数,作为该字符串的Hash值。字符串Hash函数把一个任意长度的字符串映射成一一个非负整数,并且其冲突概率几乎为零。根据经验,取P = 131或P = 1...原创 2020-01-19 15:55:55 · 1915 阅读 · 0 评论 -
数据结构基础【单调队列】
单调队列单调队列一般是具有单调性的队列,单调队列有单调递增和单调递减两种,一般来讲,队列的队首是整个队列的最大值或最小值,它的思想也是在决策集合(队列)中及时排除一定不是最优解的选择。单调队列是优化动态规划的一个重要手段。具体实现步骤:维护单调单调递增队列:若队列为空,将S[i]从队尾入队。若队列不为空,将比S[i]大的元素都从队尾弹出,然后把S[i]入队。若队列不为空且S[i]大于...原创 2020-01-19 12:12:48 · 317 阅读 · 0 评论 -
数据结构基础【单调栈】
单调栈定义:单调递增栈:出栈时为单调递增序列。单调递增栈:出栈时为单调递增序列。单调栈的经典运用:POJ2559Largest Rectangle in a Histogram题目大意:如下图所示,在一条水平线上方有若千个矩形,求包含于这些矩形的并集内部的最大矩形的面积(在下图中,答案就是阴影部分的面积),矩形个数≤105。思路:我们建立一个栈,用来保存若干个矩阵,这些矩阵...原创 2020-01-17 20:03:06 · 444 阅读 · 0 评论 -
数据结构实验:如何用bfs打印出最短路径
路径打印bfs的路径打印是把每一个map中的点记录, 假设用distance数组记录每个点对应的步数,则会出现一条单调1-2-3-4-----一直递增到最短步数的路径, 此时的这条路径即使最短路径。如图中0表示可以走,1表示由一条递增序列可以得到最短路径 1-2-3-4-5-6-7-8将每个点的坐标链接起来,由下一步的点去保存上一个坐标,如map[i][j] = (x,y);而(x,...原创 2019-11-07 23:02:21 · 720 阅读 · 0 评论 -
博弈论【sg函数】
SG函数定义:给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负。事实上,这个游戏可以认为是所有公平组合游戏的抽象模型。在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,…yk, 定义SG(x)为x的后继节点y1,y2,…yk的SG函数值构成的集合再执行mex运算的结果,即SG(x) =mex({SG...原创 2020-01-17 14:01:42 · 743 阅读 · 0 评论 -
匈牙利算法【二分图匹配】 POJ 1469 COURSES
匈牙利算法在介绍匈牙利算法之前还是先提一下几个概念,下面M是G的一个匹配。若 ,其中边 已经在匹配M上。M-交错路:p是G的一条通路,如果p中的边为属于M中的边与不属于M但属于G中的边交替出现,则称p是一条M-交错路。如:路径 , 。M-饱和点:对于 ,如果v与M中的某条边关联,则称v是M-饱和点,否则称v是非M-饱和点。如都属于M-饱和点,而其它点都属于非M-饱和点。M-可增广路:...原创 2020-01-10 16:24:14 · 308 阅读 · 0 评论 -
线段树模板 单点修改 区间修改 区间加 & 区间乘
线段树维护数组arr[] = {1,3,5,7,9,11},的区间和。每一个节点的左右孩子等于2*node + 1和 2 * 弄得+ 2;#include<bits/stdc++.h>using namespace std;const int N = 1000;void build_tree(int arr[], int tree[], int node, int st...原创 2019-12-01 16:05:45 · 350 阅读 · 0 评论 -
拓扑排序
拓扑排序 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity)。在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的开始是以它的所有前序子工程的结束为先决条件的,但有些子工程没有先决条件,可以安排在任何时间开始。为了形象地反映出整个工程中各个子工程(活动)之间的先后关系,可用一个有向图来表示,图中的顶点代表活动(子工程),图...原创 2020-01-10 15:52:34 · 311 阅读 · 0 评论 -
最小生成树 dijkstra算法模板 floyd算法模板 POJ 1287 Networking
最小生成树定义:给定一张带权无向图,G = (V, E), n = |V|, m = |E|. 由V中全部n个顶点和E中n - 1 条变构成的无向连通子图被称为G的一棵最小生成树。算法:prime 算法 和 Kruskal算法Kruskal任意时刻, 每次选取给定的边中最短的一条边,加入到森林中,直到加完全部的边。加边过程用并查集添加。添加最短边的方法按照边的权值从小到大排序,然后从...原创 2020-01-10 15:28:56 · 273 阅读 · 0 评论 -
AcWing 激光炸弹【二维前缀和】
一:问题描述题目来源一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标。现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个边长为 R 的正方形的边必须和x,y轴平行。若目标位于爆破正方形的边上,该目标不会被摧毁。求一颗炸弹最多能炸掉地图上总价值为多少的目标。...原创 2019-11-29 20:59:43 · 243 阅读 · 0 评论 -
HDU 2087【kmp模板】
**剪花布条**Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 39379 Accepted Submission(s): 24011Problem Description一块花布条,里面有些图案,另有一块直接可用的小饰...原创 2019-11-27 22:52:18 · 211 阅读 · 0 评论 -
数状数组【记忆性代码】
数组C存数据Ck的含义是某个区间和【K-lowbit(k), k】lowbit(k)是k的二进制的第一个1如(10)1010的第一个1是2#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#inclu...原创 2019-11-24 19:44:31 · 277 阅读 · 0 评论