摘要: 题目描述:输入包括n,m,n表示现在一共有n个相邻的房间,m表示有m条命令。1 a 表示现在来了一个人数为a的队伍,需要一个连续的区间能够容纳这么多人,如果能够容纳,输入最靠左边的房间的号码,否则输出0。2 a,b 表示清空[a,a+b-1]区间内所有的房子解题思路: 线段树结构体,定义需要记录的三个值,最大左连续、最大右连续、最大连续。由上面的图可知,我们现在要更新两端区间,此时,合并区间的最大连续房间数只有三种情况:1、 左区间最大连续房间数2、 右区间最大连续房间数3、 左区间最大右连续房间数 + 右区间最大左连续房间数只要能够维护这些值,当中的更新和询问就好办了。代码:View Cod 阅读全文
posted @ 2012-10-23 19:18 诺小J 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 题目描述:输入:U [1,5]D [3,3]S [2,4]C (1,5)I (2,3]输出:(2,3)解题思路:题意很明显,主要就是为了完成集合当中的并、交、差以及异或运算。仔细分析一下题目这五种运算:设T左右区间分别为l,rU T将(l,r)当中的所有点都置为1I T保留l,r中1的位置,将(-∞,l)(r,+ ∞)置为0D T将(l,r)当中全部置为0C T将(l,r)当中0,1互换,将(-∞,l)(r,+ ∞)置为0S T将(l,r)当中0,1互换至于开区间和闭区间的分别,可以用扩大总区间变为原来的两倍,用偶数来表示闭区间,基数来表示开区间。其实这个线段树题,我觉得最难的还是在取反的过程 阅读全文
posted @ 2012-10-23 12:54 诺小J 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题目描述:给定一个含有N个整数的序列,它们的下标从1到N,对该序列进行如下2种操作; 0 a b将下标为a的值变为b。 1 a b求下标[a,b]之间的最大连续和解题思路:每一段区间当中必须记录相应的值以便于更新,其中的值包括了该区间的最大左连续和、最大右连续和、最大连续和以及总和,如图分析:那么线段树此时从下往上更新的时候,合并区间时,那么对于此时我们要维护的区间最大连续和最多有三个值能够取,左区间最大连续和、右区间最大连续和、左区间的右最大连续和 + 右区间的左最大连续和,那么此时维护起来就特别的简单了。。代码如下:View Code 1 #include<iostream> 阅读全文
posted @ 2012-10-23 10:57 诺小J 阅读(234) 评论(0) 推荐(0) 编辑