数据结构
laziercs
这个作者很懒,什么都没留下…
展开
-
aho-corasick 自动机模板(来源于刘汝佳老师的白书)
/*以杭电的2222题为例,代码如下*/ #include#include#includeusing namespace std;#define N 241000int ch[N][26],cnt,f[N],last[N],val[N];struct aho_corasick{ aho_corasick(){ cnt=0; mems原创 2013-02-22 10:44:39 · 919 阅读 · 0 评论 -
自己写的splay模板
#include#include#includeusing namespace std;#define N 300010const int INF=1<<30;int tree[N][2],pa[N],cnt[N],rev[N],val[N];int Max(int a,int b){ return a>b?a:b; }class splaytree{ public: i原创 2013-04-28 09:26:05 · 819 阅读 · 0 评论 -
hdu 4009 最小树形图模版
最小树形图(摘自百度百科) 最小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T中所有边的总权值最小。最小树形图的第一个算法是1965年朱永津和刘振宏提出的复杂度为O(VE)的算法。 判断是否存在树形图的方法很简单,只需要以v为根作一次图的遍历就可以了,所以下面的算法中不再考虑树形图不存在的情况。在所有操原创 2013-02-27 19:33:26 · 564 阅读 · 0 评论 -
hdu 4622(后缀自动机|后缀数组)
//昨天晚上一直用后缀数组来写,怎么写都超时,今天看了多校3的官方解题,然来是卡常数;//今天上午就去学习了缀自动机(以前没有主动去学后缀自动机,以为后缀自动机能解的,后缀数组都能解,这次尝到了苦头);//这题官方解题说可以O(n^2)+O(1),可是我写的后缀自动机时间复杂度还是O(n*q),因为每次计算字串的个数的还是把所有的step遍历了的一遍,但是没事重新建树,建树的常数小了一些;原创 2013-07-31 16:37:03 · 1890 阅读 · 4 评论 -
划分树and主席树
//hdu 2665 这里就做为划分树模板了;#include#includeusing namespace std;#define N 100100int data[N];struct node{ int v[N]; int num[N];}td[31];void build(int l,int r,int dep){ if(l>=r)retur原创 2012-08-29 13:17:04 · 1896 阅读 · 0 评论 -
hdu 3487 Play with Chain(splay)
/*这是我第一次做splay树的题,看了一天的有关splay博客和很多有关大牛的解题报告,终于把它拿下了;有关splay树的实现可以看这个博客,讲解可以看这个博客,讲的不错,做题看这个博客;这题要在splay树上执行两个操作第一个是区间的转移: 这里又分两小步,第一小步是把区间摘下来,第二小步是把摘下的区间放到指定的位置; 要实现第一小步原创 2013-01-01 17:25:31 · 467 阅读 · 0 评论 -
左偏树的讲解
//本文转自:这里2.1.2 可并堆的定义可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作——合并操作:H ← Merge(H1,H2)Merge( ) 构造并返回一个包含H1和H2所有元素的新堆H。 O(n),用它来实现可转载 2013-03-27 17:20:05 · 1216 阅读 · 0 评论 -
hdu 3308 LCIS
/*题型:线段树;解题思路: 在线段树的节点上保存lmax,rmax,max三个值,lmax表示从该节点左端点数递增的最长长度,rmax表示终点是该节点的右端点的最长长度,max表示该区间的最长长度更新就是:如果左孩子的右端点小于右孩子的左端点,那么就合并左孩子rmax和右孩子的lmax;查询时和更新相似; 代码如下:*/ #include#inclu原创 2013-03-17 18:05:29 · 588 阅读 · 0 评论 -
hdu4533-威威猫系列故事——晒被子
/*把(0,0),(t,t)看成是一个大矩形的话,那么这个大矩形的右上坐标x是等于y的,有了这个就好办了,我们可以维持一颗关于t的线段树,比如现在对一个X矩形(x1,y1),(x2,y2)来说如果t>=Max(x2,y2),那么这个面积直接加上;在关于t的这颗线段树上操作也就是相当于更新(Max(x2,y2)~Max(t))这个区间,而对于(0~MAx(x1,y1))这个区间是无影响的原创 2013-03-29 21:54:29 · 3533 阅读 · 4 评论 -
数据结构之AVL树
1. 概述AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树种查找、插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。本文介绍了AVL树的设计思想和基本操作。2. 基本术语有四转载 2012-12-10 21:53:58 · 744 阅读 · 0 评论 -
树链剖分
原文地址:树链剖分作者:starszys “在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。 树链,就是树上的路径。剖分,就是把路径分类为重链和轻链。 记siz[v]表示以v为根的子树的节点数,dep[v]表示v的深度(根深度为1),top[v]表转载 2012-12-14 17:31:15 · 649 阅读 · 0 评论 -
hdu 3518后缀数组
/*枚举字串的长度1~n/2;通过height来判断两个字串相同的长度,在符合要求的长度里记录距离最远的两个字串的起始位置l,r最后通过l+len-1 代码如下:*/ #include#include#includeusing namespace std;const int maxn = 1100;char s[maxn];int sa[maxn],t原创 2013-02-24 14:31:36 · 592 阅读 · 0 评论 -
hdu 4680(splay tree)
解题思路: 第一种操作,用小集合暴力插入到大集合,可以证明总的时间复杂度O(n*logn); 第二种和第三种操作,每次操作O(logn) 第四种操作,因为任意3个数不能组成一个三角型,则就是长边大于剩下的两边之和,和斐波那契数列类似, 所以对于10^9的数据范围来说只有几十个,用贪心的思路,从最小的开始,暴力二分查找即可。 第五种操作,因为一个区间的gcd值原创 2013-08-17 19:29:24 · 1009 阅读 · 0 评论