摘要: 我们考虑树剖,线段树上维护一个堆,保存不经过该段区间的路径的权值。 对于一条路径我们将对于线段树中的区间提取出来,在对于线段树中进行修改。也就是在堆中插入或删除。 对于一次询问,只要找到包含该点的线段中堆顶权值最大的就行了。 阅读全文
posted @ 2016-05-14 08:55 Yangjiyuan 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher。然后就码码码。。。过是过了,然后看一下[Status],怎么慢这么多,不服。。然后就搜了一下,发现一种新东西——回文树。 回文树的功能: 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0 阅读全文
posted @ 2016-05-08 11:36 Yangjiyuan 阅读(661) 评论(0) 推荐(0) 编辑
摘要: 这里先推荐两道练习的裸题 首先是求点 【codevs4605】 LCA 就是求两个点的公共祖先,每次询问xor上上一个询问的答案。 先是两遍DFS: dfs1:把dep、siz、son求出来 dfs2:求出top和w siz[v]表示以v为根的子树的节点数 dep[v]表示v的深度(根深度为1) t 阅读全文
posted @ 2016-04-18 21:41 Yangjiyuan 阅读(762) 评论(2) 推荐(1) 编辑
摘要: 读入优化(int) 读入优化(long long) 读入优化(string,char) 输出优化 阅读全文
posted @ 2016-04-13 15:03 Yangjiyuan 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 1.求树的直径: 先随便取一个点,一遍dfs找到离它最远的点l1,再以l1为起点做一遍dfs,找到离l1最远的点l2 那么l1到l2的距离即为直径 2. 求出有多少条边在这棵树的所有直径上: 两个结论: 1)这些边一定在同一条直径上 2)它们一定是连续的 因此,只需要处理第一问求出的直径,从l2到l 阅读全文
posted @ 2016-04-13 14:58 Yangjiyuan 阅读(315) 评论(0) 推荐(0) 编辑
摘要: KMP裸题 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 #define N 200010 10 11 char a[N],b[N]; 12 int p[N],cnt[N]; 13 14 int l1,l2,t; 15 int x; ... 阅读全文
posted @ 2016-04-12 20:56 Yangjiyuan 阅读(133) 评论(0) 推荐(0) 编辑
摘要: floyed水题 阅读全文
posted @ 2016-04-11 22:09 Yangjiyuan 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 求字符串内的非空子串的数量 后缀数组!!! 阅读全文
posted @ 2016-04-10 22:28 Yangjiyuan 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 题意:给一棵树,并给定各个点权的值,然后有3种操作:I C1 C2 K: 把C1与C2的路径上的所有点权值加上KD C1 C2 K:把C1与C2的路径上的所有点权值减去KQ C:查询节点编号为C的权值 裸裸的树剖 阅读全文
posted @ 2016-04-10 20:54 Yangjiyuan 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题意:找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠)。 后缀数组 枚举字串长度h,对于每一次的h,利用height数组,找出连续的height大于等于h的里面最左端和最右端得为之l和r。如果l+h-1<r的话,说明没有重叠,答案加1. 阅读全文
posted @ 2016-04-09 17:48 Yangjiyuan 阅读(175) 评论(0) 推荐(0) 编辑