摘要: https://blog.csdn.net/qq_43553133/article/details/88831277 阅读全文
posted @ 2021-01-29 15:30 /Ranger 阅读(33) 评论(0) 推荐(0) 编辑
摘要: 任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌 求仙人掌的最短路 大致做法:利用类似tarjan的方式将一个环缩到一起,建立圆方树,对于一个环找到头节点,建立一个方点,头节点向方点连一条权值为0的边,方点向环上的点再连一条权值为该点到头节点最短距离的边 然后再树上找最短路就是找到lca然后 阅读全文
posted @ 2021-01-04 16:59 /Ranger 阅读(79) 评论(0) 推荐(0) 编辑
摘要: 核心思想:把树的结构变成链式,用线段树或者其他来处理问题 做法:利用dfs来把树重新标号,每个非叶节点有一个重儿子,对于修改整棵子树的问题:因为新标号是dfs序的所以一定是一段区间,对于修改链的利用类似lca的方式每次将深度较大的节点搞到它重链的头上,并且处理该段重链,直到两个节点到同一重链上即可 阅读全文
posted @ 2021-01-03 18:35 /Ranger 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 核心思想:在归并排序的过程中利用树状数组来统计答案(每次只分治右边对左边逆序对产生的贡献,其余递归处理即可,利用双指针的方法对于左边区间加入树状数组,对于右边区间query统计答案) 需要注意值相同时的处理方式 #include <iostream> #include <cstdio> #inclu 阅读全文
posted @ 2021-01-03 18:11 /Ranger 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 点分治 核心思路是先加入这个点的贡献,然后删除树上这个点,每次删的点是该子树的重心 给定一个有N个点(编号0,1,…,N-1)的树,每条边都有一个权值(不超过1000)。 树上两个节点x与y之间的路径长度就是路径上各条边的权值之和。 求长度不超过K的路径有多少条。 输入格式 输入包含多组测试用例。 阅读全文
posted @ 2020-11-18 22:04 /Ranger 阅读(71) 评论(0) 推荐(0) 编辑
摘要: #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 100010; int n, m; struct Node { int s[2], p, v; int sum 阅读全文
posted @ 2020-11-17 15:45 /Ranger 阅读(93) 评论(0) 推荐(0) 编辑
摘要: sa表示排名第 i 位的后缀是sa[i]~n rk表示i~n这段子串排名为rk[i] height表示与排名在上一后缀的相同前缀长度为height[i] 后缀数组统计不同子串的数量 子串是后缀的前缀 ans = 所有子串((len + 1) * len / 2) - 相同前缀数量(height之和) 阅读全文
posted @ 2020-11-16 21:23 /Ranger 阅读(91) 评论(0) 推荐(0) 编辑
摘要: 一、SAM的性质: SAM是个状态机。一个起点,若干终点。原串的所有子串和从SAM起点开始的所有路径一一对应,不重不漏。所以终点就是包含后缀的点。每个点包含若干子串,每个子串都一一对应一条从起点到该点的路径。且这些子串一定是里面最长子串的连续后缀。SAM问题中经常考虑两种边:(1) 普通边,类似于T 阅读全文
posted @ 2020-11-16 13:59 /Ranger 阅读(76) 评论(0) 推荐(0) 编辑
摘要: https://blog.csdn.net/tomandjake_/article/details/81083703 阅读全文
posted @ 2020-11-14 20:35 /Ranger 阅读(29) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2020-09-25 14:56 /Ranger 阅读(58) 评论(2) 推荐(0) 编辑