05 2017 档案
摘要:开始给出平面上n个点,m个操作,每次加一个点或者查询一个点的曼哈顿距离最近点的曼哈顿距离。(坐标为整数)。 n,m≤5×105。 分析 首先KD Tree的做法是错误的,一个经典的例子是给出n个点的圆,询问圆心。 如果这个问题是只统计一个角方向(一个点左下方,右下
阅读全文
摘要:一颗n个点的树,初始颜色都不同,初始根为1。定义一个点到根的代价为这个点到根路径上不同颜色个数。有m个操作,分三种: 将一个点到根路径上的所有点颜色改为一种新的颜色 询问一个点的子树的所有点到根的代价和 对点x进行操作1后把根换成x n,m≤105。 分析 那个修改看着是
阅读全文
摘要:题意 给一个长度为n的字符串s,再给定一个w,问对于所有的i∈[1,nw+1],s[i..i+w1]有多少个不同字串。n,w≤105。 分析 统计不同子串个数的问题可以使用后缀树。一个字符串的后缀树的总边长就是这个字符串的不同子串个数。解决这个问题,一个显然
阅读全文
摘要:Ukkonen算法是一个非常直观的算法,其思想精妙之处在于不断加字符的过程中,用字符串上的一段区间来表示一条边,并且 自动扩展 ,在需要的时候把边分裂。使用这个算法的好处在于它非常好写,代码很短,并且它是 在线的 ,时间复杂度为O(n) ,是后缀树构建算法的佳选。 算法 我们保存当前节点 的位置
阅读全文
摘要:一般求最小生成树的时候,最流行的是Kruskal算法,一种基于拟阵证明的贪心,通过给边排序再扫描一次边集,利用并查集优化得到,复杂度为O(ElogE)。另一种用得比较少的是Prim算法,利用优先队列实现做到O(ElogV)。 在翻 "ZYQN" 博客的时候,看见他写的位运算最小生成树中提到了
阅读全文
摘要:题意其实就是说有很多个点,求一组边把它们都连接起来,并且最大的那条边最小。很明显这就是一个最小生成树,是一颗保证最长边最短的树。 代码 刚刚学了个Borůvka算法,于是写了两个。 Borůvka Kruskal
阅读全文
摘要:问题 对于一个图G(V,E),它的匹配M是二元组(u,v)组成的集合,其中u,v∈V,(u,v)∈E,并且M中不存在重复的点。 当|M|最大的时候,我们称M为G的最大匹配。 当G是一个二分图的时候,它的最大匹配可以用经典的匈牙利算法或网络流算法求解。然
阅读全文
摘要:昨天我们学习了ISAP算法,它属于增广路算法的大类。今天学习的算法是预流推进算法中很高效的一类——最高标号预流推进(HLPP)。 预流推进 预流推进是一种很直观的网络流算法。如果给到一个网络流让你手算,一般的想法是从源点开始流,遇到不够的就减掉,一直往前推到汇点。这就是预流推进算法的基本思想。 每个
阅读全文
摘要:引入 最大流算法分为两类,一种是增广路算法,一种是预留推进算法。增广路算法包括时间复杂度O(nm2)的EK算法,上界为O(n2m)的Dinic算法,以及一些其他的算法。EK算法直接进行增广,而Dinic则是通过沿着最短路增广优化了复杂度,它的做法是每次进行bfs求出层次图,再dfs沿着层
阅读全文
摘要:给出一棵树,每个点有颜色,每种颜色有一个v属性,第i次经过颜色j可以获得wivj的价值。多次修改单点颜色,查询路径的价值。n,m,q≤105。 分析 可以发现,经过颜色的顺序是没有关系的,只需要知道有多少个颜色就可以了。也就是说,这个问题可以快速转移,修改是单点修改
阅读全文
摘要:题意 给出两个长度小于等于2000的小写字母串,四个问题: A的最短子串不是B的子串 A的最短子串不是B的子序列 A的最短子序列不是B的子串 A的最短子序列不是B的子序列 分析 虽然求的是不公共,但是这还是一个字符串的匹配问题,只不过是求匹配不到。 对于子串的匹配问题,可以使用后缀自动机。然而对于子
阅读全文
摘要:环的问题,经典方法倍长串,求出后缀数组,扫一次sa,如果sa[i]小于等于n,那么就输出这个字符串结尾的位置(即s[sa[i]+n 1])。 代码 c++ include include include using namespace std; const int maxn=4e5+10; char
阅读全文
摘要:一棵树,每条边有边权,点有点权r,n次加入一个点,给出它与父亲的连边长度和它的点权,问此时总共有多少对点满足r_i+r_j\ge dist(i,j)。n\le 10^5。 分析 树上点对统计可以使用点分治。每次只需要统计新增了多少对满足条件的点。设一对点(u,v)的lca为k
阅读全文