数据结构
文章平均质量分 75
sdj222555
这个作者很懒,什么都没留下…
展开
-
POJ 3784 Running Median 动态求中位数 堆
题意。1000个case每个case 输入若干个数,对第k个输入,如果k为奇数,则输出前k个数的中位数那么这就是动态求中位数了实现的思路也比较简洁用两个堆, 大顶堆和小顶堆每次输入一个数,如果这个数比当前的中位数大,就存入小顶堆中, 否则就存入大顶堆。然后调整, 小顶堆元素的个数要等于大顶堆的元素个数,或者比其多1。 如果小顶堆的元素太多,就原创 2015-01-23 17:36:21 · 4480 阅读 · 0 评论 -
HDU 4056 涂色 并查集
这题用线段树写的话会很恶心人 并且不是现场赛的话,HDU上内存有限制所以就是用并查集来搞这种涂色问题,并且效率上也快一些这种方法之前也接触过 详见从acmol的空间看的http://blog.acmol.com/?p=751#include #include #include #include #include #include #include #includ原创 2012-09-05 13:41:51 · 1383 阅读 · 0 评论 -
POJ 2201 RMQ 笛卡尔树
给出一些结点每个节点有两个关键字要求构造一棵树第一个关键字满足二叉搜索树的性质,第二个关键字满足小堆的性质和1785几乎一模一样题目还让输出yes 或者no 实际上,因为所有的第一关键字互异,第二关键字也互异,所以一定能构造出来这样的树这题不用treap的原因我嫌treap有点麻烦,还旋转啥的,没RMQ直观好想#include #include #include原创 2012-08-26 15:43:57 · 1634 阅读 · 0 评论 -
POJ 2114 树的分治
这题跟1741的不同之处在于查找==k的是否存在 修改一下统计函数即可#include #include #include #include #include #include #include #include #include #define eps 1e-5#define MAXN 11111#define MAXM 55555#define INF 100000原创 2012-08-26 12:44:05 · 2071 阅读 · 0 评论 -
POJ 2104 归并树 or 划分树
首先写一下归并树的版本吧归并树实际上是一种类似于归并排序外加线段树的东西用到线段树的地方就是划分区间。我们都知道,线段树是一层一层这样下来的,每层上有若干个区间。归并树的作用就是,对每一层上的所有区间,其内部都是排好序的。也就是说,第一层是所有数排好序,第二层划分了两个子区间,两个子区间内部都是排好序的。依次直到叶子结点当然,建树的过程跟线段树是一样的,只不过在递归的过程中原创 2012-08-25 23:44:46 · 1172 阅读 · 0 评论 -
POJ 2051 堆
这题就是一个小顶堆而已注意结构体里小于号的重载 重载结果的不同会导致写法的不同#include #include #include #include #include #include #include #include #include #define eps 1e-5#define MAXN 111111#define MAXM 111111#define I原创 2012-08-24 16:59:09 · 690 阅读 · 0 评论 -
POJ 2010 堆
这题实际上是考察了堆的插入与删除操作,用到的是大顶堆有人用二分过的此题,我觉得二分的边界处理应该比较麻烦吧,尤其如果数据中出现有分数相同的,确实不好处理比较直观的思想就是堆了。我们首先按照分数来进行排序,排序后进行枚举,对枚举的每个位置,看该位置之前最小的n/2个需求与该位置之后的最小的n/2个需求的和是否满足要求。实际上预先处理一下就可以了,先从头到尾进行扫,将每个位置的元素插入原创 2012-08-23 00:35:45 · 1071 阅读 · 0 评论 -
POJ 1785 treap 或 RMQ
本题大意就是。建立一颗树,每个结点有两个关键字,要求第一个关键字满足二叉搜索树的性质,第二个结点满足堆的性质首先,要把所有结点按照第一个关键字按非递减排序,这样之后,每个结点左边的结点都比该结点的第一个关键字小,右边的则第一个关键字都比他大。这样的话按顺序每次插入右子树,因为要满足二叉搜索树的性质, 插入之后不能满足堆的性质时就左旋。#include #include原创 2012-08-22 14:33:51 · 2047 阅读 · 0 评论 -
POJ 1741 树的分治
题意就是求树上距离小于等于K的点对有多少个n2的算法肯定不行,因为1W个点这就需要分治。可以看09年漆子超的论文本题用到的是关于点的分治。一个重要的问题是,为了防止退化,所以每次都要找到树的重心然后分治下去,所谓重心,就是删掉此结点后,剩下的结点最多的树结点个数最小。每次分治,我们首先算出重心,为了计算重心,需要进行两次dfs,第一次把以每个结点为根的子树大小求出来,第二次是从原创 2012-08-22 02:09:08 · 9997 阅读 · 2 评论 -
POJ 3642 长方体体积并 线段树 扫描线
这题就是给出了好多个长方体, 求出那些被覆盖了 3次及以上的体积我们注意到z的范围很小,而且就给了1000个长方体那么可以把z坐标离散化然后在相邻的z坐标空间内,就变成了求面积覆盖记录三个变量,代表一次覆盖,两次覆盖,三次覆盖及以上#include #include #include #include #include #include #include原创 2012-08-29 14:24:20 · 1325 阅读 · 0 评论 -
POJ 1577 二叉搜索树
这题前边说了一堆废话 大意就是给出了一个二叉搜索树,但给出的方式比较奇怪,是删除叶子的顺序。 即把树上的叶子结点给出,然后揪掉这些叶子,把剩下的结点中变成叶子结点的再给出,这样一直到所有的结点都被揪掉。 最后要求这个二叉搜索树的先序遍历这题解决的方式很简单,按照他给的那些东西,倒着建立二叉搜索树就行了。为什么呢? 我们观察一下,可以发现,最后一个揪掉的一定是根节点,再往上,每一次揪掉原创 2012-08-20 23:48:37 · 2953 阅读 · 0 评论 -
POJ 1204 AC自动机
题目就是给出了一个矩阵,由大写字母构成,然后让你查找某些单词在矩阵中出现的位置出现的方式可能有8种,从某个位置往北连续的字符串,往东北,东........八个方向的只要有满足的 就可以最后输出位置和方向,然后往北的输出时为A,东北的是B,依次顺时针类推#include #include #include #include #include #include #inclu原创 2012-08-19 01:40:33 · 1253 阅读 · 0 评论 -
后缀数组习题
原文:http://hi.baidu.com/lewutian/blog/item/4d098138d29c34f9b311c725.html单独把它列出来是因为这个东西真的很神奇~~~后缀数组经典思想:多串合并+二分答案+最优性--->可行性例 1 :最长公共前缀给定一个字符串,询问某两个后缀的最长公共前缀。 // 直接套用,ans=min( heig原创 2012-08-19 13:23:09 · 3272 阅读 · 0 评论 -
POJ 1186 hash 线性探测再散列
一直以来我都觉得线性探测再散列这个方法一定很低效结果碰到今天这题之后我惊奇的发现 链表居然被线性探测再散列秒杀了这个hash方法是将大数取模,放到一个位置上,如果这个位置被占用了,就往后移1格,再被占再移动知道能 放到某个位置上。详细见数据结构书真是太神奇了懒得写DFS 直接for的所以代码看起来比较多,但是也比较直观了#include #include #i原创 2012-08-18 14:19:00 · 1359 阅读 · 0 评论 -
POJ 1840 Eps 简单Hash
a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 对于这个等式,给出了a1到a5,最后求有多少组X1---X5满足这个等式,其中所有的Xi都是不能等于0的。然后每个Xi的范围是-50到50。这个数据范围是能hash的保证。分成两组,前3个X是一组,后两个一组。/*ID: sdj22251PROG: LANG: C++*/#include原创 2012-04-03 14:04:46 · 1067 阅读 · 0 评论 -
POJ 3349 Snowflake Snow Snowflakes hash表
题目大意是给出n组序列,判断其中是否有同构的同构的定义是,若一个序列中,从某个位置往左读,到头后从最后边接着往左读到起点,或者同理往右读,能够跟另一个序列一样,就表示两个序列是同构的。那么,由于n是巨大的,常用的做法就是哈希表了将序列映射成某个值,然后判断。由于序列中存在一些较大的值,使得哈希的难度增大,这里我们采用的方法是,先使用一个比较容易想出来的哈希操作,然后对于哈希值相同的原创 2012-02-07 17:21:29 · 864 阅读 · 0 评论 -
POJ 3368 RMQ
此题用线段树也能做 用RMQ也能做当然RMQ的速度比线段树要快很多 #include #include #include #include #include #include #include #include #include #define eps 1e-5#define MAXN 111111#define MAXM 11111#define INF 1000原创 2012-08-17 13:14:57 · 1473 阅读 · 0 评论 -
HDU 4366 树转化为连续序列 线段树
这题跟 http://poj.org/problem?id=3321 这题的转化形式基本一样本题给的是一棵树。 然后找子孙中能力值大于父节点并且忠诚最高的。由于树的结构不好搞线段树,所以要映射到一个连续序列上搞,把这个结点的子树都能映射到一个连续区间上就好办了。很常见的套路就是DFS时间戳,记录进入结点的时间戳和出结点的时间戳,两个时间戳之间的都是这个结点的子孙结点了。而我们要找能原创 2012-08-15 00:52:54 · 1149 阅读 · 0 评论 -
POJ 2932 扫描线思想
这个题确实太神奇了大意就是给出了n个互不相交的圆。 各个圆之间有可能一个完全包含了另一个。这里包含就是一个圆整个都被另一个圆圈再里面。现在求那些没有被包含的圆的序号。数据量是4W所以N2的肯定不行。苦思冥想,不得其解http://blog.sina.com.cn/s/blog_6e7b12310100qoeh.html看了这个之后不由得大原创 2012-09-11 16:35:10 · 1209 阅读 · 0 评论 -
POJ 2778 AC自动机
这题还是挺经典的首先的话,是建立自动机的过程。其实就是一个状态的转移,看一个字典树中的某子串加上一个字母是否会变成一个非法的串,然后都给标记起来。最后就看有多少种状态,就建立多大的矩阵,对某种状态,如果加上一个字母后是合法的,就把表示状态可以转移。对应的矩阵中的位置就++然后就是矩阵乘了,乘了k次后的矩阵x[i][j] 就表示从i状态到j状态路径转移长度为k的个数 ,那最后的结果就是从原创 2012-09-11 10:30:01 · 995 阅读 · 0 评论 -
POJ 3321 apple tree 树状数组
题目大意,就是给出一棵树,可能有很多叉,然后每个叉上长一个苹果,有两种操作,第一种是C ,意思就是change,如果这个叉上有苹果,就摘掉,如果没有,就长一个。另一种操作是Q,意思就是询问,问的是某个结点及其子树上的苹果有多少个。这是很明显的区间求和问题,用树状数组来很方便,关键是这个是树形的结构,所以必须先把树映射出来,也就是相当于把数据离散化了,这里就要先进行一次DFS了,开两原创 2012-04-04 17:02:32 · 1233 阅读 · 1 评论 -
[Usaco2010 Mar]balloc 农场分配
Farmer John最近新建立了一个农场,并且正在接受奶牛的畜栏分配请求,有些畜栏会看到农场美妙的风景。:)农场由N (1 (1 这样的话奶牛可以在这段牛棚里面转悠。(当然,这段畜栏必须要有足够的空间)给出M (1 具体做法就是对请求,按照r关键字递增排序,然后r相同就按照l递减排序。总的来讲就是优先截止早的区间,相同的话就优先区间长度原创 2013-10-24 21:53:43 · 2028 阅读 · 0 评论 -
后缀数组练习题若干
POJ 1743 不可重叠最长重复子串二分答案。 即子串的长度,假设为k时。利用height数组,将排序后的后缀分为若干组。每组内的height值都不小于k。然后只需查看组内是否有满足要求的两个不会产生重叠的子串即可。#include #include #include #include #include #include #include #defin原创 2013-10-13 21:00:12 · 3664 阅读 · 0 评论 -
SPOJ DQUERY 求区间内不同数的个数 主席树
这题跟HDU3333差不多吧。离线的做法很简单,不再说了以前做过。主席树的做法就比较暴力了。。什么是主席树呢。。其实是某种称号。在该题中的体现是可持久化的线段树。对于一个数如果以前没出现过就插入到主席树中否则就删除以前那个。再插入主席树。注意,所有的更新和删除都是建立了新的节点来保持其历史状态的。。对于T[i]我们存的是从原创 2013-10-07 22:50:14 · 4686 阅读 · 0 评论 -
HDU 4456 Crowd 坐标旋转 二维树状数组
大意就是给出一个矩阵初始每个位置上的值都为0然后有两种操作一种是更改某个位置上的值另一个是求某个位置附近曼哈顿距离不大于K的所有位置的值的总和然后这里用了一个非常牛叉的技巧将所有点绕原点左旋45°然后新的坐标也很好计算x' = (x - y) * sqrt(2) / 2y' = (x + y) * sqrt(2) / 2由于都是小数所以乘个sqr原创 2013-09-01 16:29:14 · 2167 阅读 · 0 评论 -
HDU 4605 Magic Ball Game 树状数组
题目大意很简单。有一颗树(10^5结点),所有结点要么没有子结点,要么有两个子结点。然后每个结点都有一个重量值,根结点是1然后有一个球,从结点1开始往子孙结点走。每碰到一个结点,有三种情况如果此球重量等于该结点重量,球就停下了如果此球重量小于该结点重量,则分别往左右儿子走的可能都是1/2如果此球重量大于该结点重量,则走向左儿子的概率是1/8,右儿子的概率是7/8然后若干原创 2013-08-04 13:00:12 · 1824 阅读 · 0 评论 -
BZOJ 1058 [ZJOI2007]报表统计
小Q的妈妈是一个出纳,经常需要做一些统计报表的工作。今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一。经过仔细观察,小Q发现统计一张报表实际上是维护一个非负整数数列,并且进行一些查询操作。 在最开始的时候,有一个长度为N的整数序列,并且有以下三种操作: INSERT i k 在原数列的第i个元素后面添加一个新元素k; 如果原数列的第i个元素已经添加了若干元素,则添加在这些元素原创 2012-11-29 22:11:17 · 2140 阅读 · 0 评论 -
[Usaco2008 Nov]lites 开关灯 线段树 区间异或及求和操作
Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是 牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个 彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以 改变第i个灯的状态.奶牛们执行M (1 嚓。好久没写线段树原创 2012-11-29 22:33:15 · 3075 阅读 · 3 评论 -
NOIP 2005 等价表达式 四则运算
这题就是一个比较经典的四则运算表达式求值由于只有一个未知数a,所以我们可以选择找几个数带入a 中,然后求值,看与原式子是否相同 中间可能会爆long long ,不过按理来说爆完之后等价的表达式的值还是相同的。求四则运算的过程也是相当经典的栈的应用了用两个栈,一个存操作,一个存数然后符号之间有个优先级别的问题。这时候要分栈内和栈外两种来算 详见我手写了个表原创 2012-10-20 20:15:55 · 4566 阅读 · 5 评论 -
POJ 3261 可重叠的出现K次的最长重复子串
给定一个字符串,求至少出现K次的最长重复子串,这k个子串可以重叠。所谓出现K次就是在任意K个地方出现了这个子串,并不要求这K个是连续的。那么 根据罗大神的论文,用后缀数组解之二分答案,然后用height数组判定是否至少出现了K个这种子串#include #include #include #include #include #include #inc原创 2012-09-25 15:31:58 · 1843 阅读 · 0 评论 -
HDU 4400 Mines
题目大意是二维坐标系上有一些炸弹,每个炸弹有x,y坐标和爆炸后波及的范围r,这个r指的是跟自己曼哈顿距离r以内的点就类似于扫雷那样,一个炸弹爆炸可能引起一片一片的炸弹炸出去然后有一些询问,问点燃某个炸弹后会有多少个炸弹爆炸 已经炸过的就不算了应该不难想到是用BFS去找临近的点我的做法是把横坐标离散化,然后每个横坐标建立一个vector,把相应的y都塞进去然后每次询问,就原创 2012-09-22 21:49:46 · 2798 阅读 · 1 评论 -
POJ 3017 单调队列+最值优化 的动态规划
令f[i] 表示前i个数按照题目要求的最小的和则必然有f[i] = min(f[j] + max(a[j +1 , a[j + 2].....a[i])) 其中j由于a数组都是大于0的,所以可以发现f必然是非递减的。设a[j + 1], a[j + 2], ...a[i]中值最大的下标为k设x为[j + 1,k]的任意一个下标,则a[x],a[x+1],..原创 2012-09-19 16:59:11 · 4142 阅读 · 0 评论 -
POJ 3693 重复次数最多的连续重复子串 后缀数组
题目大意就是求重复次数最多的连续重复子串。例如abababc 答案就是ababab 因为ab连续出现的次数最多并且题目还要求输出字典序最小的比如abababcdcdcd ababab和cdcdcd都符合要求但是ababab字典序小具体做法参见罗穗骞的论文穷举子串的长度L,然后求长度为L的子串最多出现几次首先连续出现一次是肯定的,所以只考虑出现两次及以上的情况原创 2012-09-17 17:38:34 · 1349 阅读 · 0 评论 -
POJ 2946 字符串hash + BFS
题意就是给出一个地图。有一个起点,一个终点我们要从起点到终点去。但是地上有毒液,不能走,不过有一些箱子可以供你跳来跳去。这些箱子的高度是2,3或者4然后每次跳一步只能去4个方向相邻坐标的箱子。箱子之间不用管高度是多少,只要相邻了就可以跳上去而且箱子可以放倒。也是4个方向,放倒后的长度就是之前的高度,但是放倒一次后就不能再放倒了。我们可以规定此时的高度为1。而且放倒必须是有确切的那么多空原创 2012-09-14 18:53:46 · 1325 阅读 · 0 评论 -
POJ 3695 容斥原理求若干矩形并 (n <= 20)
题目大意是给出若干个矩形(n 每个询问会给出一些矩形的编号,问这些矩形的面积并有多大谈到矩形并,也许第一反应都是线段树但是此题有一个特点,就是n非常小,m却非常大用线段树很有可能会不行于是换个思路,n很小,我们可以把所有的可能组合情况都考虑到,然后呢预处理出来,这样询问时就是O(1)的查询了但是1也就是说我们没必要把所有情况都考虑到。只需要考虑这m个询问中的情况就可原创 2012-09-16 10:42:41 · 2685 阅读 · 1 评论 -
HDU 4374 单调队列优化 DP
这题的转移很明显。用dp[i][j] 表示到达i层j位置时的最大得分sum[i][j] 表示第i层前j个数的和dp[i][j] = max(max(dp[i - 1][j + k] + sum[i-1][j +k-1] - sum[i - 1][j - 1] + score[i][j]), max(dp[i - 1][j - k] - sum[i-1][j -k] + sum[i -原创 2012-08-16 21:50:49 · 1756 阅读 · 1 评论 -
HDU 4125 2011福州现场赛E题 KMP+笛卡尔树
题意就不描述了。 主要说一下我的构造第一个串的过程对给出的序列,比如5 1 3 2 7 8 4 6 给每个数按输入的顺序对应一个编号5 1 3 2 7 8 4 61 2 3 4 5 6 7 8然后我们手动建这颗二叉搜索树。观察它,可以发现,每个结点的编号是满足堆的性质。也就是如果把这个编号当做每个结点的第二个关键字,这就是原创 2012-09-12 11:42:44 · 3743 阅读 · 0 评论 -
POJ 4047 Garden 线段树
这题只要想出怎么建树就简单了吧。他问的是连续k个值最大的是多少就可以用1~k之和,2~k+1之和,3~k+2之和.......做为结点。然后就发现,变成了简单的区间更新和区间查询问题了。#include #include #include #include #include #include #include #include #include #define e原创 2012-08-14 02:22:38 · 1205 阅读 · 0 评论 -
HDU 4351 Digital root 线段树 区间合并
看了解题报告后说有一种离线不用线段树的做法,表示不解只会用线段树做因为题目中所查询的区间,是所有的子区间的结果的并。所以区间合并就很必要了。每个结点,记录这个区间的和的数根, 记录本区间内从左端点为端点往右的连续区间出现的数根,从右端点为端点往左的连续区间出现的数根,以及整个区间能出现的数根比赛的时候狂WA一下午。最后发现查询的时候左右区间合并有问题,查询的时候也需要像push原创 2012-08-10 03:09:30 · 1193 阅读 · 0 评论 -
HDU 3938 Portal 并查集
给一个无向图,求有多少个点对,使得两点间的路径上的花费小于L,这里路径上的花费是这样规定的,a、b两点之间所有的路径中的最大边的最小值。 当然题目上不是这么写的。它问的是有多少种路径,这里就比较模糊了,到底两个路径怎样才算是两种路径呢,这时候重新看题,可以发现,如果理解为路径中经过的点不同的话,题目中给的所谓两点间的花费这个定义就没有意义了,所以就可以猜测,题目要求的是有多少个点对了。原创 2012-04-09 00:05:18 · 1789 阅读 · 0 评论