数据结构
文章平均质量分 79
自在_飞花
这个作者很懒,什么都没留下…
展开
-
ZOJ 2112 Dynamic Rankings BIT套ChairTree
劳资就是想单纯的测个模板,怎么就特喵的这么难。首先说一下自己对主席树的理解。作用:确定区间[L,R]内的第K大数,或者区间内有多少个不同个元素。主席树的另一个名字叫做函数式线段树,然后我查了一下函数式的特点,其中之一就是不修改状态。从主席树上来看这个特点就是:在向主席树插入第 i 个元素之后,我们仍能查询到没插入 i 之前的状态。主席树的构造:对于有n个元素,s个不同元原创 2015-04-21 14:27:00 · 706 阅读 · 0 评论 -
CodeForces 13E. Holes 分块处理
好像正解是阿三地方啊手动发士大夫阿娥撒地方撒地方原创 2014-10-29 10:19:29 · 899 阅读 · 0 评论 -
初涉后缀数组
以POJ 1743为例。模板中的基数排序基于前向星。具体证明过程详见 算法合集之《后缀数组——处理字符串的有力工具》,很不错的一篇论文。#include #include #include #include #include #include #include #include #include #include #include #pragma comment(l原创 2014-10-10 16:42:34 · 697 阅读 · 0 评论 -
初涉树链剖分 hrbust 2065
一般适用于对于树的区间查询与修改。几个定义:树链:树上两点之间的路径。剖分:将树上的边划分为轻边和重边。重儿子:在 u 的儿子节点中,siz最大的那个节点即为 u 的重儿子。(若存在多个,则任选一个)轻儿子:除重儿子之外的所有儿子节点均为轻儿子。重边:父节点与重儿子之间的连边。轻边:父节点与轻儿子之间的连边。重链:由重边首尾相连组成的路径。操作之前需原创 2014-03-27 19:58:23 · 829 阅读 · 0 评论 -
CodeForces 7D Palindrome Degree
字符串hash。首先说下需要注意的地方:当对Mod取余时,可能造成本不相同的,取余结束之后相同了。此时应对多个不同的Mod取余,多次计算只能说降低上述情况的发生。感觉正式比赛中不会有这种题,比较拼RP。比如此题,Mod = 2^32,可以,Mod = 2^64,WA了。。。#include #include #include #include #include #includ原创 2014-10-24 16:28:27 · 863 阅读 · 0 评论 -
POJ 3691 DNA repair 基于AC自动机的DP
dp[i][j] 表示长度为 i 的前缀到达第 j 个节点的最小更改数目。很显然有dp[0][0] = 0;dp[ i ][ j ] = min(dp[ i ][ j ],dp[i-1][k] + (j == k ? 0 : 1)),当且仅当j,k满足下列条件时。j 不为某条模式串的末节点 且 j 到 root 的由失败指针组成的路径上无末节点。j 是k的儿子节点 或者 j 的父节原创 2014-08-17 19:22:06 · 940 阅读 · 0 评论 -
POJ 2778 DNA Sequence AC自动机 + 矩阵快速幂
首先建立Trie和失败指针,然后你会发现对于每个节点 i 匹配AGCT时只有以下几种情况:i 节点有关于当前字符的儿子节点 j 且安全,则i 到 j找到一条长度为 1的路。i 节点有关于当前字符的儿子节点 j 且 不安全,则i 到 j没有路。i 节点没有关于当前字符的儿子节点但是能通过失败指针找到一个安全的节点j,那么 i 到 j 找到一条长度为1的路。关于节点安全的定义:原创 2014-08-17 15:03:54 · 786 阅读 · 0 评论 -
初涉AC自动机 新姿势get√
可以理解为Trie上的KMP。建议打好Trie和KMP的基础再来搞。从复习KMP开始算一共搞了四天才写出第一份模板. . . . . .推荐一篇博客:http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html(好像是把HDU带进Final的队长写的)HDU 2222 Keyword Search(入门神题)询问原创 2014-08-16 19:34:07 · 647 阅读 · 0 评论 -
HDU 2222 Keyword Search AC自动机模板
#include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:1024000000");#define EPS (1e-6)#define LL long long#de原创 2014-08-16 19:37:59 · 882 阅读 · 0 评论 -
POJ 2985 The k-th Largest Group 线段树求整体第K大
最开始尝试着拿伸展树去水,原创 2014-08-11 21:33:20 · 818 阅读 · 0 评论 -
又见关系并查集 以POJ 1182 食物链为例
简单的关系并查集一般很容易根据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离。对于此题:若u,v不在一个集合内,则显然此条语句会合法(暂且忽略后两条,下同)。那么将fu 变为 fv的儿子时需加一条权值为 w 的边,w 满足(w + ru)%3 = (rv+ (D == 1? 0 : 1))%3(ru,rv分别为u,v与fv的关系,即距离)。之所以在D == 2原创 2014-07-31 22:04:04 · 752 阅读 · 0 评论 -
HDU 1677 Nested Dolls
过了之后感觉以前真的做过这种类型的题。之前一直很疑惑二级排序的优先级问题,现在发现二级排序真的没有绝对的优先级。对于此题,若按W排序,则有1到i件物品的W均小于等于第i+1件物品(设为A)的W,那么对于第i+1件我们在[1,i]中要选取一个B,使得B.w 这就是所谓的最接近A的B。因为对于W,后面的均大于等于前面的,所以我们需要一个尽可能大的H。Splay_Tree实现。#原创 2014-08-04 18:34:40 · 898 阅读 · 0 评论 -
HDU 2475 Box 树型转线型 + 伸展树
树型转线型,第一次听说这个概念. . . , 但是以前已经接触过了,如LCA的预处理部分和树链剖分等,但是没想到还能这么用,三者虽说有不同但是大体思想还是很相近的,学习了。推荐博客http://blog.csdn.net/lyhypacm/article/details/6734748转成线型之后,就变成了伸展树的模板题。另外要注意,伸展树的特点是平均时间复杂度接近log(n),所以一原创 2014-06-20 13:38:05 · 848 阅读 · 0 评论 -
CodeForces 15D Map 单调队列优化
两次单调队列求出每个子矩阵的最小值,区间减法求出每个子矩阵的和,然后丢到优先队列里跑出来就好了。写锉了,加了读入挂才过。#include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker,原创 2014-10-30 10:52:27 · 870 阅读 · 0 评论 -
HDU 4821 String 字符串HASH
又get了一种新的Hash方法。Seed取素数可以降低取余相同的概率,目测是这样的。Hash[i] = Hash[i+1] *Seed + s[i]-'a'。那么 [i,i+l-1]这一段的Hash值即为Hash[i] - Hash[i+l]*Seek^l。#include #include #include #include #include #include #incl原创 2014-11-18 20:51:17 · 746 阅读 · 0 评论 -
允许重复数字的划分树
const int MAXN = 50010,MAXM = 20;int num[MAXN],tmp[MAXN],pre[MAXN];int ans[MAXM][MAXN],val[MAXM][MAXN];void Init(int l,int r,int h){ if(l == r) return ; //printf("l = %2d r = %2原创 2015-04-08 16:49:02 · 631 阅读 · 0 评论 -
SPOJ TTM To The Moon 主席树的区间更新与查询
首先要吐槽一下,区间更新的主席树的内存开销已经瞬间爆炸了。。n,m 首先主席树所需要的lazy与普通线段树的lazy无差。主席树需要另开一个标记来判断当前节点是否是前一层的节点,如果是就在pushdown的时候分配一个新的。HDU已经MLE成狗了。不过可持久化的BIT 貌似可过,线段树被卡系数了OTZ。。。#include #include #include #include原创 2015-04-22 13:32:53 · 979 阅读 · 0 评论 -
HDU 2784 Connections between cities 并查集+Online_LCA
模板攒起来#include #include #include #include #include #include #include #pragma comment(linker, "/STACK:1024000000");#define LL long long intusing namespace std;const int MAXN = 10010;const原创 2015-04-03 20:36:48 · 942 阅读 · 0 评论 -
2011 Asia Dalian Regional Contest _ Rescue the Rabbit AC自动机+状压DP
很直白,很实在,很炫酷的一道题。dp[i][j][k] 表示长度为 i 时,最后一位在自动机的第 j 个状态点,已经包含了状态 k 的字符串的最优解。然后dp[i][j][k] 可以转移到 四个位置 即在i+1位放置‘A’,‘G’,'C','T',j显然会在自动机走,k根据 j 的变化而变化。最后答案为 dp[ l ][ j ][ k ]的最大值。内存卡的比较厉害,可以用滚动数组。原创 2015-03-20 15:31:57 · 875 阅读 · 0 评论 -
ZOJ 3228 Searching the String AC自动机的不重复匹配
这个判断方法真的没想到。。。对于在S中匹配M,如果M上一次的匹配位置pre与这一次的匹配位置now满足now-pre >= M.length,则加1。这个判断太跳了233 。#include #include#include#include#include#include#include#include#include #include #include #原创 2015-03-20 10:33:32 · 851 阅读 · 0 评论 -
HDU 2243 考研路茫茫――单词情结 AC自动机 + 矩阵快速幂
根据AC自动机构造矩阵,然后丢到模板里跑一跑就好了。设所有情况的总数为 sum,不合法数为 non,则答案anw = sum - non。首先sum = sigma(26^i) (1 然后non 为 所有不含词根的情况。对于所有的AC自动机上的节点 i 枚举下一个可能的字符,即‘a’ - ‘z’,然后根据自动机的规则肯定会转移到某个节点 j ,如果 j 及 j 通过fail指针原创 2015-03-20 10:43:53 · 808 阅读 · 0 评论 -
AC自动机 + 二维最短路 HDU 4511 小明系列故事――女友的考验
这个题还是比较好想的。首先将所有不可行方案建立AC自动机,然后跑最短路。首先将小明放在(sta = 0,pos = 0)处,sta表示AC自动机上点的编号,pos表示坐标点的编号。根据pos枚举下一次可以到达的地方[pos+1,n],然后sta在自动机上移动,如果某一步会使sta位于有标记的节点,那么这一步是不可行。#include #include#include#incl原创 2015-03-20 10:29:19 · 808 阅读 · 0 评论 -
Codeforces 506D Mr. Kitayuta's Colorful Graph 并查集+水水的分类讨论+水水的离线预处理
首先读入所有的边与询问。将边按颜色分类。按颜色进行并查集,若此并查集内的点若此并查集内的点 > 100,则将与这些点相关的所有询问查一遍。那么时间复杂度为100*100/2*(M/100),或者为M/100*Q。极限的时候两种方法都在一亿左右了,而且每次还需要在map里搞一搞,还要查询是否联通,不知道为啥没有超时。。#include #include #include原创 2015-01-21 09:32:05 · 1047 阅读 · 0 评论 -
面积并问题 HDU 1542 Atlantis
HDU 1542 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1542题目大意就是几个矩形相交,然后求出总的覆盖面积,覆盖多次的按一次算。典型的面积并问题。大体思路: 记录所给的点,排序,去掉重复的点,对点编号,可以理解成存放点的数组的下表即为编号。 对Y轴建立线段树,利用线段树计算面积。 AC_code:原创 2013-09-18 15:20:41 · 702 阅读 · 0 评论 -
Codefoeces 387E - George and Cards 贪心+线段树
首先要知道每次拿走最小才会达到最优,因为最小的不会给其他的提供任何加分,只有可能减小加分。删除卡片的次序确定了,剩下的就是确定每段区间的左右端点。pos[i] 表示数字 i 在初始序列中的位置。首先枚举i (i = 1 -> n),如果不需删除,则将pos[i]放入set S中,如果不需删除,则在S中二分查找上下界。总的时间复杂度为o( (n-k)*log(k) )原创 2015-01-17 08:31:33 · 813 阅读 · 0 评论 -
501D Misha and Permutations Summation 数据结构+打脸题
都快退役啦,小白书上的例题还不会。给出一个序列S,则S的字典序为 sigma(dp[i] * (n-i)!) (1 对于两个序列A,B,(ord(A) + ord(B))%n!可以转化成 sigma( (A_dp[i] + B_dp[i] + (A_dp[i+1]+B_dp[i+1])/(n-i+1))%(n-i+1) )( 1 解码部分和编码部分为逆操作,详见代码。#inc原创 2015-01-15 17:08:25 · 1008 阅读 · 0 评论 -
Codeforces 496E - Distributing Parts 贪心
复习好无聊,忙里偷闲水一发。贪心,让每个演唱家尽量发挥最大的作用。对于每个演唱家选择演唱的曲子时应满足,min( aj | bj 将演唱家和曲子分别按d,b升序排序。然后枚举演唱家i,将满足的dj 没怎么用过set,好水。#include #include #include #include #include #include #include #incl原创 2014-12-24 17:15:03 · 887 阅读 · 0 评论 -
HDU 3234 Exclusive-OR Regional的题就是硬啊卧槽
带权并查集,思路很清晰,代码很难看。对于 I u v ,分以下几种情况不合法。1.num[u] 已确定 && num[u] != v 。2.num[u] 的根已确定,若num[u] == v与根节点有冲突。若合法,则修改num[u] 且 修改num[u]的根节点的信息。对于 I u v w ,分以下几种情况不合法。1.num[u] ,num[v] 均已确定原创 2014-08-03 13:57:23 · 1095 阅读 · 0 评论 -
浅谈二维中的树状数组与线段树
一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此。但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行。但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问。此时就需要根据线段树与树状数组的优缺点来选择了。做一下基本操作的对比,如下图。因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不原创 2014-06-17 14:32:42 · 1430 阅读 · 0 评论 -
SDUT 1232 / POJ 1785 Binary Search Heap Construction
最近总是不在状态,满脑子都是有的没的,感觉乱糟糟的。计划也越来越难了,做起来各种力不从心。好像整个人已经走在失控的边缘了。笑里春秋多少泪。唉。好了,下面扯题。给出N对字符串和数字,然后建树。要求字符串符合排序二叉树,数字符合堆性质。然后按照中序遍历顺序输出。好了,思路已经很明确了,明显的Treap。以前做过一个询问区间第K大的数的题,貌似这种数据结构可以胜任,可是宝哥给我推荐了划分树.原创 2014-02-22 23:29:35 · 1171 阅读 · 0 评论 -
CodeForces_GoodBye 2013_F New Year Tree LCA问题
题意:在一棵树上每次在一个节点上增加两个子节点,问每次更新后树上的最长的一条链是多少。设最长链的长度为len,链的两个端点为e1,e2,每次增加点的编号为a1,a2。开始时,显然有len = 2,且可以有 e1 = 2,e2 = 3。每次通过判断a1与e1,e2之间的较长的一段是否大于len,若不大于则无需更新。若大于则更新相应节点,若较长一段为a1与e1,则令e2 = a1,否原创 2014-01-16 20:23:10 · 936 阅读 · 0 评论 -
CodeForces 385C Bear and Prime Numbers 线段树+素数筛
题意:首先给你N个数。然后有M次询问,每次询问给出一段区间,首先找出这段区间内的所有素数,然后计算对于这段区间内第 i 的素数Pi,这N个数中有多少个数能被Pi整除,设有Si个数能被Pi整除,然后输出Si的和。思路:因为这个N个数的范围为 [ 2 , 1000W]memset(mark,0,sizeof(mark)); for(i = 2;i <= 10000000; ++i)原创 2014-01-25 11:43:16 · 1313 阅读 · 0 评论 -
浅谈LCA的几种算法
LCA,Lowest Common Ancestor,最近的公共祖先。在一棵树中对于两个节点u , v找出节点T,使得T同时为u,v的祖先。显然这样的T点肯定存在且有可能有多个,其中深度最大的那个点肯定为即为u,v两点的LCA。关于LCA的解法有很多种,暴力枚举,事先需要知道所有询问的离线的tarjan算法和基于RMQ的在线算法,下面说一下自己对这种几种算法的理解。 ⒈最容易想到的暴力搜索原创 2014-01-10 10:37:44 · 9273 阅读 · 0 评论 -
POJ 3321 Apple Tree DFS + 树状数组
题意:一棵树树上有N个分叉点,分个分叉点上有一个苹果或者没有苹果,现在想知道以某一个分叉点为根节点的子树有多少苹果。从题目的叙述中可以知道给出的数据并不是一棵二叉树,所以一开始往并查集的方向做,每次更新都要从当前节点一直更新到根节点。当这棵树是一条单链的时候,这种做法的耗时就显得有点丧心病狂了。。。。下面说正解。此题其实为区间查询题,可是问题在于线段书只能查询一段连续的区间内的值,原创 2013-12-26 10:44:12 · 845 阅读 · 0 评论 -
POJ 1961Period / POJ 2406 Power Strings / POJ 3461 Oulipo /SDUT 2747 循环节 初涉KMP
又到了一学期一次的考试周,然后同学说数据结构要考KMP,然后训练计划上正好也有KMP就顺便看了一下。话说KMP这个算法还是挺形象的,整个算法建立在next数组之上。next[i]存储的为若在第 i 个字符处匹配失败,指针应回指到的位置。关于KMP的讲解,数据结构课本上已经讲得很详细了,然后网上也有很多博客讲得很不错,所以在这里就不重复了。下面推荐一下几篇不错的博客。http原创 2013-12-23 16:24:13 · 1027 阅读 · 0 评论 -
POJ 3264 Balanced Lineup 最基本的RMQ
其实这个题早就过了,只是当时为了偷懒拿线段树做的。当时肤浅的认为RMQ问题线段树都能胜任,现在才发现毕竟土洋。不过线段树做多了,RMQ就显得很容易理解了。其实RMQ很多算法,不过最通用的应属ST算法,总体思想就是一个很简单的dp。以求区间最大值为例,数组dp[ i ][ j ]记录的是区间[ i , i + (1也就是说是从第 i 个元素开始,连续的 (1不难发原创 2014-01-03 20:27:31 · 863 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies? 线段树。。还有方向感
这道题不仅仅是在考察线段树,还他妹的在考察一个人的方向感。。。。和线段树有关的那几个函数写了一遍就对了,连改都没改,一直在转圈的问题的出错。。。。题意:从第K个同学开始,若K的数字为正 则往右转,否则往左转,转到的那同学出圈,知道剩下最后一个人。 输出得到蛋糕最多的人的名字和块数。线段树的节点中存的是这一段内还有几个人没有跳出,思路很简单,详见注释。#include原创 2013-09-30 20:52:28 · 857 阅读 · 0 评论 -
POJ 2104 K-th Number 初涉划分树
题意: 给一个数组,对其进行多次查询。每次查询为(L,R,K),即在闭区间内[L,R]第K大的数。思路:本来没什么思路的,然后学长说这是划分树的模板题,然后就没有然后了......说一下自己对划分树的理解:个人感觉划分树就是线段树的一种,每一个节点对应一段区间,节点内有两个数组num[],ans[]。num[]为对应线段内的所有数据,按输入数据存放。ans[]内存放的信原创 2013-11-28 20:13:22 · 755 阅读 · 0 评论 -
POJ 2777 Count Color 线段树
线段树的模板题。#include #include #include #include #include #include using namespace std;struct N{ int l,r,col; bool MarkVisit;} st[400100];void init(int l,int r,int site){ st[s原创 2013-09-30 16:33:00 · 776 阅读 · 0 评论 -
SDUT 216 数据结构实验之二叉树的建立与遍历
1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 struct N 10 { 11 char data; 12 N *l,*r; 13 }; 14 15 N *creat()原创 2013-09-18 15:20:51 · 624 阅读 · 0 评论