摘要: http://poj.org/problem?id=2482A了这题后,我就在想,是不是ACMER都找不到女朋友.....这题看似很新颖,其实就是求线段树区间最值。所谓区间最值,其实就是和RMQ差不多,只不过RMQ是以点为单位,而这个是以区间为单位。怎么扯到区间最值了呢?因为每一颗星星,它都有一个亮度,假设这个星星现在正在最左边,那么它的亮度将会影响到向右W的范围。也就是说[star.x,star.x+W]这个区间都会因为这个亮度的影响而加上这个亮度值,最后求一个[x,x+W]的区间,并且该区间的亮度最大,这就是区间最值!方法和RMQ一样,只是不是更新到节点,而是更新到相应线段即可!这里还要注 阅读全文
posted @ 2011-11-14 10:50 Accept 阅读(259) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3225这题很有意思,对于[0,65535]这么一个区间,初始值为0,问最后为连续1的子区间有哪些。很有趣的是,这题涉及到了开区间和闭区间,即() 和 [] 。确是比较棘手!解决的办法是将所给的数据范围乘以2,然后根据给的是开区间或则是闭区间修改数据,例如:给你(2,3]这样的数据,如何处理呢?我们将范围乘以2,得到(4,6],然后,如果左边是开区间,则将4加1,得到5,同理,如果右边是开区间,则将6减去一个1。为什么这样做呢? 看看,因为数据乘以2后,得到的结果一定是偶数,而偶数加一减一后,肯定得到奇数。也就是说,如果最后得到的数据是偶数, 阅读全文
posted @ 2011-11-14 10:17 Accept 阅读(247) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1436这道题最终就是问,两两可见的三条线段组有多少组。所谓两两可见,指的是某一条横线可以连接到两条线段,并且中途不会碰到其他线段。很显然又是一道区间染色的题目嘛,关于区间染色的解法,不多说了,这里说关键的!这题就sample来说,按它给的数据来建树的话,最右边的和最左边的是无法触碰到一起的,因为第二根线段和第三根线段之间只留下了[2,3]这样的小缝隙,而这样的小缝隙在线段树建树的过程中,是会被二分忽略掉的。看图上面黑色的,就是题目所给的sample所对应的坐标系上的图样,而下面的红色的,就是上面的黑色的在线段树中所对应的图样。很显然最右边的 阅读全文
posted @ 2011-11-13 15:50 Accept 阅读(227) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1828线段树求解重叠矩形周长。这个比求并面积交面积难度大一些,要多想想才能明白回忆求并面积的时候的第二种方法,利用线段树树形dp出可以与下一个将要插入的线段去构成并面积的最大y坐标长度,即tree[1].len;然后求并面积的时候,只需要将tree[i].len*(line[i+1].x-line[i].x)即可。想一想,并面积求的是乘绩,很容易想到周长其实就是求和。也就是y坐标长度加上x坐标的长度。而tree[1].len就已经求的了目前y坐标的可加长度,只需要将它减去上一次得到的tree[1].len再取 阅读全文
posted @ 2011-11-13 14:57 Accept 阅读(1116) 评论(0) 推荐(1) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1255这题...如果会求面积并的话,面积交就不是问题了。只需要将原先判断线段树中cover值为大于等于1改为大于等于2即可!什么都不会的同学,请看上一个随笔http://www.cnblogs.com/ka200812/archive/2011/11/13/2247064.htmlView Code 1 #include<iostream> 2 #include<string> 3 #include<stdlib.h> 4 using namespace std; 5 6 阅读全文
posted @ 2011-11-13 10:18 Accept 阅读(484) 评论(1) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1542嗯哼,要开始利用线段树求解矩形面积的并、交、以及周长了。这题是求面积并的有两种方法,一种思想很简单,操作方便,理解容易,但效率不高。先看一下吧给定一个矩形的左下角坐标和右上角坐标分别为:(x1,y1)、(x2,y2),对这样的一个矩形,我们构造两条线段,一条定位在x1,它在y坐标的区间是[y1,y2],并且给定一个cover域值为1;另一条线段定位在x2,区间一样是[y1,y2],给定它一个cover值为-1。根据这样的方法对每个矩形都构造两个线段,最后将所有的线段根据所定位的x从左到右进行排序。上图中 阅读全文
posted @ 2011-11-13 10:12 Accept 阅读(6442) 评论(10) 推荐(1) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3016挺有趣的一个以“是男人就下100层”为背景的题目,要求从最高处往下跳,跳到最下一层时候所得分数的最高值。这题不难,首先将线段从低到高排序,用这些线段对区间进行染色,每次染色之前先询问一边从线段的左右节点跳下去所能到达的线段。记为一条路径。最后从高到底根据我们所有的路径信息进行一次DP即可View Code 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace st 阅读全文
posted @ 2011-11-12 16:59 Accept 阅读(457) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2871求解区间内连续空闲区间!题目有四种操作:1、New X,查找一个有x连续空间的区间,并返回区间的首位置,要求答案尽量考前。如果找不到x的连续空间,则返回“Reject New”。这是最基础的线段树操作。和pku 3667、hdu 1540一样的过程2、Free X,释放第x个记忆片段,所谓第x个第一片段,指的是剩余的记忆片段中,相对来说第x次 “New x” 的结果。将其区间跟新即可,关于这道题,记录第x个记忆片段是需要技巧的,直接用数组模拟无疑是找死。纠结了许久以后,还是看了别人的结题报告,人家都是用 阅读全文
posted @ 2011-11-12 15:29 Accept 阅读(317) 评论(0) 推荐(1) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1540又是一道跟新查找最大了连续空余区间的题目,由于每次都是炸一个点和修复一个点,所以max_val域都省下了~由于题目只要求数目,无涉及节点的先后,所以查找的话随便怎么查吧,只要你别遗漏就好了还有一个要注意的就是一个隧道是可以重复炸毁重复修复的~~View Code 1 #include<iostream> 2 #include<string> 3 #include<stack> 4 #include<algorithm> 5 using namespace 阅读全文
posted @ 2011-11-11 16:46 Accept 阅读(283) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3667哈哈,经典中的经典题啊。利用线段树求最大连续空闲区间,并返回空闲区间的起点坐标。View Code 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 struct node 7 { 8 int l; 9 int r; 10 int l_val; //从左节点数起的最大连续空闲区间 11 int r_val; //从右节点起的最大连续空闲区间 12 ... 阅读全文
posted @ 2011-11-10 21:21 Accept 阅读(280) 评论(0) 推荐(0) 编辑