随笔分类 -  数据结构

摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747题意:有一组序列a[i](1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 #define lz 2*u,l,mid 11 #define rz 2*u+1,mid+1,r 12 typedef long long lld; 13 const int maxn=222222; 14 int a[maxn], b[maxn],... 阅读全文
posted @ 2013-09-18 20:17 Mr. Ant 阅读(5204) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578题意:有一个序列,有四种操作:1:区间[l,r]内的数全部加c。2:区间[l,r]内的数全部乘c。3:区间[l,r]内的数全部初始为c。4:询问区间[l,r]内所有数的P次方之和。思路:比较复杂的线段树操作。只有一个询问操作,那就是询问[l,r]之间数的p次方之和,我们不可能全部查询的节点,会TLE,最好的情况就是查询到一段[a,b],这段区间内所有的值都相等,那么返回(b-a+1)*val 的值即可。 根据询问操作我们即可意识到我们要维护的是区间内所有值都相同的情况的区间。对于覆盖和加乘操作 阅读全文
posted @ 2013-08-14 11:25 Mr. Ant 阅读(1308) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4630题意:给你n个数据范围在[1,n]中的数,m个操作,每个操作一个询问[L,R],让你求区间[L,R]内任意两个数的最大公倍数。思路:是线段树是必然的 O.O 。顺着来不好解决,只能离线处理试试。按r从小到大排序,数组a[i]从左到右扫一遍,对每个a[i]都要进行处理,先因数分解,pre[X]表示约数X在前面最后出现的位置。开始处理的是pre[X]到当前位置r都对约数X进行比较更新,后面想想这样是有问题,因为这样不能保证约数X出现在pre[X]与r的中间位置,所以这里我们只对位置pre[X]进行 阅读全文
posted @ 2013-08-04 14:20 Mr. Ant 阅读(554) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419题目大意:给你n个矩形,每个矩形都有一种颜色,矩形覆盖会出现另外一种颜色,问你所有矩形中不同的颜色各出现的面积。解题思路:开始一直只用一个标记,1,2,4,处理来处理去发现一直搞不来。最后用两个标记,一个存+1,-1,和普通面积并类似,另外开一个三位的标记数组,0位表示'R',1位表示‘G’,2位表示‘B’,sum数组要开8个状态(和8颗线段树思想类似),每次处理到当前节点时,该节点所有sum值清0(叶子节点的sum[u][0]表示的就是区间长度,要进行预先建树),根据自己当前 阅读全文
posted @ 2013-07-27 10:40 Mr. Ant 阅读(334) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1199题目大意: 一段长度未知的线段,一种操作:a b c ,表示区间[a,b]要涂的颜色,c=w涂白色,c=b涂黑色,问你最长的白色区间段时多长。解题思路: 就快去南京邀请赛了,最近做题超没状态,CF rating一直掉,这么简单的线段树离散化居然搞了我一个晚上,纠结。 开始用线段树区间合并的方法做,WA到死,换个写法,又WA到死,没处理好边界问题。 这题用普通的离散化没用,藐视这种离散化第一次遇见,以前的离散化要么就是点化点,线段化点,这题不一样,是点化线段,一不小... 阅读全文
posted @ 2013-04-27 23:27 Mr. Ant 阅读(440) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4288题目大意:有n个操作和一个集合(初始为空),并且集合内元素满足按顺序排列。现有三种操作:add x : 将元素x加入集合中。del x: 将集合中的x元素删除。sum: 统计集合中元素下标满足i%5==3的总和。解题思路: 以为在线段树方面小有火候,现在发现自己在线段树方面还没起火,处于冒烟阶段。 这题让我蛋蛋又碎了,WA了一个晚上,各种调试,最后发现是数组必须开成节点4倍大小,我只开了两倍大小,导致了一个晚上的悲剧(why?个人认为两倍足够了,可以证明的)。 可以... 阅读全文
posted @ 2013-04-25 18:57 Mr. Ant 阅读(255) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4267题目大意:给你一列数区间范围为[1,n],区间每个数有一个对应值a[i]。接下来有Q个操作操作1:"1 a b k c", 区间[a,b]内满足条件(i-a)%k==0的数值a[i]加c。操作2:“2 a” ,输出a[i]的值。解题思路:这题蛋都碎成渣渣了,RE几次,MLE无数次。1、按线段树建树情况可推出,即使成为完全平衡树开也只有2*n-1个节点,开2*n的大小完全没问题啊,但它就是RE,不解。2、这题我的初始化开始没有建build()函数,而是直接对flag[][]初 阅读全文
posted @ 2013-04-21 23:02 Mr. Ant 阅读(236) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2890题目大意:给你一个含n个数的序列,再给你一个k,让你求最少重复k次的最长子序列(子序列不能重叠)。解题思路:先吐槽一下,题意不明,蛋疼许久。我可以这么理解 : 1、保证子序列重复次数cnt大于k的前提下,len为一个子序列长度,然后最长子序列最长,即cnt*len最大。 2、保证子序列重复次数cnt大于k的前提下,只需让子序列长度len最长即可。我在理解1中挣扎了许久才发现我题目都理解错了,题目意思是理解2,擦擦擦。 这题X值很大,先离散化处理一下。 以前写过一... 阅读全文
posted @ 2013-04-21 14:57 Mr. Ant 阅读(804) 评论(0) 推荐(0) 编辑
摘要:今天没事就去刷以前hdu做过但是没过的题,前面的题现在还是能过的,做到这题就卡了,传说中的划分树,只闻其名未见其身。然后搜索了一下划分树的资料,擦擦擦,这不就是同快排的原理+线段树的操作,两者一融合进化成了划分树么。前面两个都会,学习起来倍感轻松。 建树过程: 先对区间[1,n]内所有元素进行排序, 阅读全文
posted @ 2013-04-20 22:07 Mr. Ant 阅读(991) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4521题目大意:有n个数,求间距大于d的最长递增子序列。解题思路:扎眼一看,不是简单的dp嘛,再眨眼一看,n最大为10^5,蛋碎一地呀。 这题不仅要线段树功底好,还要有比较强的dp思想,从第d+1个位置开始更新,每个节点的sum值保存的是从第1个数到当前数的最长符合要求的子序列,查询的时候只需查询线段树中值在其左边的最大的sum[u](最长符合要求序列)。 1 #include <iostream> 2 #include <cstdio> 3 #include <cst 阅读全文
posted @ 2013-03-30 18:16 Mr. Ant 阅读(729) 评论(0) 推荐(0) 编辑
摘要:学习AC自动机之前,必须先得把字典树和KMP算法给理解透了,否则会让你吃尽苦头,切不可本末倒置。 参考文献:http://www.cs.uku.fi/~kilpelai/BSA05/lectures/slides04.pdf 简单介绍一下AC自动机: 1.必须得先建一颗字典树,这是构建AC自动的基本结构,好比建房子的地基。 2.接下来就是AC自动机的构造了,里面最强大的就是fail指针(失败指针)了,fail指针的作用是当前字符匹配失败的时候字符跳转到下一个和此字符有最长公共前缀的字符,如果没有的话直接跳到根节点,且跳转必是深度深的向深度浅的跳转。 通过深度跳转的规律可知,我们... 阅读全文
posted @ 2013-03-14 20:02 Mr. Ant 阅读(684) 评论(0) 推荐(0) 编辑
摘要:寒假到现在这一个月断断续续的做了一些有关线段树的题目,有句话确实说的没错:量的积累必将产生质的变化,可能是先学习了伸展树吧,学习起线段树感觉上手很多。一直ym各路大神,看着比自己牛X几倍的人一直比我努力着,我不甘。虽然现在依然很菜,但是我会加油的。 一、单点更新 1、 hdu1166 地兵布阵 题目 阅读全文
posted @ 2013-03-11 20:15 Mr. Ant 阅读(3146) 评论(1) 推荐(3) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3255题目大意:给你多块蔬菜地,蔬菜地有重叠部分,每部分种的蔬菜可能相同也可能不同,重叠部分种植蔬菜价值最贵的,最后让你求最大利润。解题思路: 这是我做的最坑爹的一题,几乎让我快哭了,Wrong answer了三十多次, 重拍了五六次代码。 每块蔬菜地种植蔬菜收获的利润为 val=x*y*price。 面积乘以价格,题目的重点转换在于如何确定重叠区域怎么让它种植最贵的蔬菜。 观察利润计算公式 : x*y*price <==> x*y*h 可以转换为求体积并。 说实话,这题一看真的很简单, 阅读全文
posted @ 2013-03-07 17:13 Mr. Ant 阅读(632) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642题目大意:给你n个立方体,求相交区域大于等于三次的体积和。题目大意: 写这题之前我先做的hdu3255,有思路但是Wrong Answer到死。被逼无奈搜题解,都说是线段树扫描线求体积并,这之前我只会二维面积并。 其实吧,三维的和二维的其实差不多。如果一个立方体的高为h,那么我们可以把它分割成h层,对每一层进行面积并的扫描,注意是从下往上。 这题离散化x坐标是为了方便建树,离散化z坐标是为了节约时间。 剩下的问题就变成了如何求覆盖大于等于三次体积范围。 问题同样可以转化为二维的面积并求解,.. 阅读全文
posted @ 2013-03-06 22:33 Mr. Ant 阅读(1060) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871题目大意:四个操作:1、New x 找一段长为x的空区间段填满。 下面用0表示空单元,1表示非空单元。2、Free x 释放包含x的区间段3、 Get x 找到第x个区间段4、将整个区间都置为空。解题思路: 可以说这题应该算是线段树之区间操作里面比较好的经典题了。要注意的地方很多。对vector容器的用法又了解了很多。赞一个View Code 1 #include <cstdio> 2 #include <vector> 3 #include <iostream& 阅读全文
posted @ 2013-03-03 16:29 Mr. Ant 阅读(224) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828题目大意: 给你多个矩形,求他们合并和的周长,被覆盖的边不能算进周长之内。解题思路: 其实周长并和面积并没什么很大的区别,只不过周长并增加了判断左右端点是否被覆盖的标记 lbd 和rbd 数组, 以及numseg 数组 记录连续区间段数。 numseg : 一根扫描线扫描过去,会记录有多少个连续的区间段,每个连续的区间段都有两条相等的竖边,而每次扫描过去竖边长度都相等。 参考文献 :陈宏《数据结构的选择与算法效率》View Code 1 #include <iostream> 2 阅读全文
posted @ 2013-02-27 16:08 Mr. Ant 阅读(347) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://poj.org/problem?id=1151题目大意: 给你n个矩形,求他们的总面积之和。解题思路: 这是我写的线段树扫描线第一题,搜狗了一下,说实话网上的解释都很抽象,昨晚用手机百度一下看到了一张让人一看就有灵感的扫描线图,今天找了很久都没找到那张图了,本来还想copy一下给大家分享来着。 哈哈,不过大家别急,为了方便描述,自己动手画了几个。 四条红线为矩形的上下底边,这里我们称之为扫描线(实际编程中不存在,只是一个概念)。 如图所示,要求两个矩形的面积并,可以把矩形分成几个小矩形,最后的面积总和为它们的和。 对于每个小矩形其 面积S=长*宽。宽就是两... 阅读全文
posted @ 2013-02-26 20:43 Mr. Ant 阅读(5553) 评论(2) 推荐(7) 编辑
摘要:题目链接:http://poj.org/problem?id=1703题目大意:给定m个操作:D x y:x罪犯和y罪犯不在一个团伙。(总共只有两个团伙)A x y:询问x和y罪犯的关系解题思路: 很容易想到是并查集,但最后还是让我纠结了良久。一直MLE。 对于每次的D x y操作,每次不仅要找到两个不同集合标志头进行更新,还要更新a数组,即存储的相对集合的标志头。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #includ 阅读全文
posted @ 2013-02-25 19:58 Mr. Ant 阅读(238) 评论(0) 推荐(0) 编辑
摘要:题目连接:http://poj.org/problem?id=3667题目大意:让你对一个区间进行操作。输入Q C 或者 Q C D。Q ==1 输入C: 表示让你求1-n中是否有连续的C个空hotel,如果有多个连续的C个空hotel,则取最左边的,并输出最左边的第一间hotel标号。让人住进去,那么这些空房就不能住人了。如果不存在连续的C个hotel,则输出 0。Q==2 输入 C D: 表示 从标号C到C+D-1的hotel的房间全部要退房,那么这么hotel都变成空。解题思路:用到线段树的区间操作,具体解析见代码。 1 #include <cstdio> 2 #includ 阅读全文
posted @ 2012-12-25 16:28 Mr. Ant 阅读(211) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://poj.org/problem?id=2777题目大意: 给你一段区间[1,L] , 给定初始所有节点颜色为1,有下面两种操作:1、 “C A B D” 将区间[A,B]改变颜色为D。2、“P A B” 计算区间[A,B]有多少种不同的颜色。解题思路: 最土的可能100000个节点*100000次运算,暴力肯定TLE。解决这一类题目一般会想到线段树或者树状数组,这里用线段树。 这里每次改变都从根节点到叶子节点都同步更新的话肯定TLE,这里又要用到区间更新。 区间更新: 区间更新指的是当要改变某个区间[tl,tr]的颜色值,当往下递归到这个区间[l,r]包含在[tl,.. 阅读全文
posted @ 2012-12-18 20:56 Mr. Ant 阅读(475) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示