![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-线段树
lab104_yifan
这个作者很懒,什么都没留下…
展开
-
Acdream 1076 XXX的机器人(dp + 线段树)
题目链接:http://acdream.info/problem?pid=1076这题DP的状态很好设计,dp[i][j]表示指令i的时候,全排列状态是j,全排列一共就120个,预处理出来就可以了那么问题就在于对于一个指令怎么快速获得这个整个区间的置换乘积,这步其实利用一个线段树维护就可以了,但是要注意置换是不满足交换律的,所以正序逆序都要保存一遍代码:#include #inc原创 2015-05-04 00:56:56 · 1522 阅读 · 0 评论 -
HDU 3642 Get The Treasury(线段树)
HDU 3642 Get The Treasury题目链接题意:给定一些立方体,求体积重叠超过3次的思路:由于z坐标只有500,那么就可以枚举z坐标,每次做x,y的面积并即可,用线段树维护代码:#include #include #include using namespace std;const int N = 1005;const int I原创 2014-10-15 14:31:15 · 974 阅读 · 0 评论 -
HDU 3265 Posters(线段树)
HDU 3265 Posters题目链接题意:给定一些矩形海报,中间有孔,求贴海报的之后的海报覆盖面积并思路:海报一张可以切割成4个矩形,然后就是普通的矩形面积并了,利用线段树维护即可代码:#include #include #include using namespace std;typedef long long ll;const int原创 2014-10-15 09:33:47 · 958 阅读 · 0 评论 -
Codeforces 85D Sum of Medians(线段树)
85D Sum of Medians题目链接题意:一个集合有添加,删除元素,每次查询输出集合位置为i % 5 == 3的位置和思路:线段树,线段树记录下% 5 == 0, 1, 2, 3, 4的和,并且记录一个mov表示右移多少,每次添加一个值的时候,就当前位置之后的一整段位置都要右移一个单位,这样去搞线段树维护一下即可代码:#include #inclu原创 2014-10-16 01:07:27 · 1403 阅读 · 0 评论 -
HDU 1828 Picture(矩形周长并)
HDU 1828 Picture题目链接题意:给定n个矩形,输出矩形周长并思路:利用线段树去维护,分别从4个方向扫一次,每次多一段的时候,就查询该段未被覆盖的区间长度,然后周长就加上这个长度,4个方向都加完就是答案代码:#include #include #include using namespace std;const int N = 5005原创 2014-10-14 22:51:11 · 1015 阅读 · 0 评论 -
HDU 4027 Can you answer these queries?(线段树)
HDU 4027 Can you answer these queries?题目链接题意:给定一个数列,两种操作0 a b 把[a,b]区间内的数字都开根1 a b 询问区间[a,b]和思路:注意开根最多开到1或0就不在变化,那么一个数字最多开63次,然后题目保证数列和小于2^63,所以实际上对于每个数字的修改总次数并不多,因此修改操作每次就单点修改,线段树多开原创 2014-10-15 20:45:37 · 920 阅读 · 0 评论 -
HDU 3308 LCIS(线段树)
HDU 3308 LCIS题目链接题意:一个序列,每次询问一个区间内最长连续上升子序列,或者修改一个位置的值思路:线段树的区间合并,和最长连续子序列和是一样的思路,记录lsum, rsum, sum,表示左边连续长度,右边连续长度,和区间最长长度,然后pushup的时候进行区间合并操作即可代码:#include #include #include us原创 2014-10-13 17:21:14 · 907 阅读 · 0 评论 -
POJ 3667 Hotel(线段树)
POJ 3667 Hotel题目链接题意:有n个房间,现在有两个操作1、找到连续长度a的空房间,入住,要尽量靠左边,如果有输出最左边的房间标号,如果没有输出02、清空[a, a + b - 1]的房间思路:线段树的区间合并,记录下左边连续最长和右边连续最长空房间,和每一段的最大值,这样pushup的时候就是进行区间合并,注意查询的时候由于是要尽量左,所以先查左孩子,原创 2014-10-13 15:49:21 · 1011 阅读 · 0 评论 -
POJ 2991 Crane(线段树+计算几何)
POJ 2991 Crane题目链接题意:给定一个垂直的挖掘机臂,有n段,现在每次操作可以旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标思路:线段树,把每一段当成一个向量,这样每一段的坐标就等于前几段的坐标和,然后每次旋转的时候,相当于把当前到最后位置全部加上一个角度,这样就需要区间修改了,然后每次还需要查询s,和s + 1当前的角度,所以需原创 2014-10-13 11:20:28 · 1137 阅读 · 0 评论 -
HDU 3397 Sequence operation(线段树)
HDU 3397 Sequence operation题目链接题意:给定一个01序列,有5种操作0 a b [a.b]区间置为01 a b [a,b]区间置为12 a b [a,b]区间0变成1,1变成03 a b 查询[a,b]区间1的个数4 a b 查询[a,b]区间连续1最长的长度思路:线段树线段合并,需要两个延迟标记一个置为01,一个翻转,然后由原创 2014-10-13 20:28:08 · 976 阅读 · 0 评论 -
ZOJ 3511 Cake Robbery(线段树)
ZOJ 3511 Cake Robbery题目链接题意:给定一个n边形,切m刀,问切了之后最大边数的子块边数是多少,保证切的边不会交叉思路:由于有保证切的边不交叉这个条件,所以可以按切掉点数排序,点数最少优先切,因为点数最少肯定是被包含了,这样一刀刀切过去,切过的点就剔除掉,并记录下最大值,利用线段树维护即可代码:#include #include #i原创 2014-10-17 16:19:33 · 980 阅读 · 0 评论 -
HDU 3954 Level up(线段树)
HDU 3954 Level up题目链接题意:k个等级,n个英雄,每个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,另一个操作询问区间经验最大值思路:由于等级少,所以每个结点用Max[10]记录下每个等级的最大值,如果有一个升级就一直找到底,因为一个英雄升级最多10次,所以这个操作最多就10W次可以接受,剩下就是普通的区原创 2014-10-16 23:07:13 · 1198 阅读 · 0 评论 -
HDU 4046 Panda(线段树)
线段树区间合并,合并注意下r, b的转移即可代码:#include #include #include using namespace std;const int N = 50005;int t, n, q;char s[3], str[N];#define lson(x) ((x<<1)+1)#define rson(x) ((x<<1)+2)struct No原创 2015-05-12 00:50:17 · 762 阅读 · 0 评论 -
Codeforces 193 D. Two Segments(线段树)
机智的线段树题,参考了这个题解http://www.cnblogs.com/keam37/p/4335914.html代码:#include #include #include using namespace std;typedef long long ll;#define lson(x) ((x<<1)+1)#define rson(x) ((x<<1)+2)co原创 2015-04-07 19:43:13 · 1086 阅读 · 0 评论 -
hihocoder 1074 字体设计(线段树)
这题可以把问题转化为,对于一个位置,限制的位置必然是,递增时候,小于他本身,或者递减时候,大于他本身的位置,然后在这个区间中,寻找最大(小)值的位置,这样利用线段树维护即可,对于一个限制位置,可以先把数字离散化掉,然后用权值做节点很容易就处理出来了,然后第二个问题就是普通的rmq问题代码:#include #include #include using namespace std;原创 2015-04-01 14:49:50 · 807 阅读 · 0 评论 -
SWUN OJ 1749(DP + 线段树)
SWUN 1749题目链接思路:lis一样的状态转移方程,不过要利用线段树去维护,每次更新到i,相应的维护i - d之后的区间的最大值,不断转移即可代码:#include #include #include using namespace std;#define lson(x) ((x<<1)+1)#define rson(x) ((x<<1)+2)原创 2014-12-29 15:39:18 · 934 阅读 · 0 评论 -
FZU 2136 取糖果(线段树)
FZU 2136 取糖果题目链接题意:中文题思路:线段树,先把所有糖果按价值排序,然后线段树结点表示糖果有无,如果当前找不到一个连续段满足长度,就继续加糖果,如果满足,答案就是最后加入的那个糖果,利用线段树的区间合并去找连续段长度代码:原创 2014-10-20 20:07:55 · 894 阅读 · 0 评论 -
HDU 2871 Memory Control(线段树)
HDU 2871 Memory Control题目链接题意:内存操作,和hotel那题差不多,多一个get操作思路:线段树区间合并,其他都差不多,多一个get操作,这个用set去乱搞就过了- -,估计数据鶸吧,多这个操作感觉要用splay去搞了代码:#include #include #include #include using namespace原创 2014-10-18 21:43:50 · 885 阅读 · 0 评论 -
HDU 3340 Rain in ACStar(线段树+几何)
HDU 3340 Rain in ACStar题目链接题意:给定几个多边形(3-5边形),然后中间有一些询问,询问一个区间的总面积思路:多边形分割为梯形,梯形的面积为上底d1 + 下底d2 乘上 高度 / 2,两个梯形面积累加的话,可以等价为上底下底累加,所以就可以用线段树搞了,然后给定的多边形点是按顺序的,可以利用容斥去方便把一个询问拆分成几个询问代码:#原创 2014-10-18 15:32:44 · 1144 阅读 · 0 评论 -
HDU 3016 Man Down(线段树)
HDU 3016 Man Down题目链接题意:是男人就下100层的游戏的简单版,每次只能从两端下落,求落地最大血量思路:利用线段树可以处理出每个线段能来自哪几个线段,然后就是dag最长路了代码:#include #include #include #include using namespace std;const int N = 100005原创 2014-10-17 12:40:42 · 1091 阅读 · 0 评论 -
POJ 2482 Stars in Your Window(线段树)
POJ 2482 Stars in Your Window题目链接题意:给定一些星星,每个星星都有一个亮度,现在要用w * h的矩形去框星星,问最大能框的亮度是多少思路:转化为扫描线的问题,每个星星转化为一个矩形,那么等于求矩形相交区域值最大的区域,利用线段树去维护即可代码:#include #include #include using namesp原创 2014-10-16 17:39:55 · 942 阅读 · 0 评论 -
HDU 1540 Tunnel Warfare(线段树)
HDU 1540 Tunnel Warfare题目链接题意:n个村庄连成一排,有3种操作D x 破坏x村庄R 恢复上一个被破坏的村庄Q x 询问x村庄所在连续村庄长度思路:线段树的区间合并,记录区间左边,右边连续,和区间最大连续,由于都是单点操作所以没必要延时了,然后对于恢复操作可以用一个栈记录下之前的操作即可代码:原创 2014-10-13 22:16:31 · 716 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments(线段树)
POJ 1436 Horizontally Visible Segments题目链接线段树处理染色问题,把线段排序,从左往右扫描处理出每个线段能看到的右边的线段,然后利用bitset维护枚举两个线段,找出另一个两个都有的线段代码:#include #include #include #include #include using namespace std原创 2014-10-11 22:09:20 · 876 阅读 · 0 评论 -
ZOJ 3813 Alternating Sum (牡丹江网络赛E题)
ZOJ 3813 Alternating Sum题目链接赛后补题中,这题真心恶心爆了先推下公式,发现是隔一个位置,长度从最长每次减2,这样累加起来的和,然后就可以利用线段树维护,记录4个值,奇数和,偶数和,奇数答案和,偶数答案和,这样pushup的时候,对应要乘系数其实就是加上左边奇(偶)和乘上右边长度,线段树处理完,还有个问题就是查询可能横跨很多个区间,这样一来就要把区间原创 2014-09-10 10:12:16 · 4859 阅读 · 0 评论 -
UVA 11402 - Ahoy, Pirates!(线段树)
UVA 11402 - Ahoy, Pirates!题目链接题意:总的来说意思就是给一个01串,然后有3种操作1、把一个区间变成12、把一个区间变成03、把一个区间翻转(0变1,1变0)思路:线段树搞,开一个延迟标记当前操作即可,注意几种状态间的转变方式即可代码:#include #include #include using namesp原创 2014-07-30 23:27:58 · 1688 阅读 · 0 评论 -
UVA 11992 - Fast Matrix Operations(线段树)
UVA 11992 - Fast Matrix Operations题目链接题意:给定一个矩阵,3种操作,在一个矩阵中添加值a,设置值a,查询和思路:由于最多20列,所以完全可以当作20个线段树来做,然后线段树是区间修改区间查询,利用延迟操作,开两个延迟值一个存放set操作,一个存放add操作代码:#include #include #include原创 2014-07-30 03:28:04 · 1471 阅读 · 0 评论 -
UVA 1232 - SKYLINE(线段树)
UVA 1232 - SKYLINE题目链接题意:按顺序建房,在一条线段上,每个房子一个高度,要求出每间房子建上去后的轮廓线思路:线段树延迟更新,一个setv作为高度的懒标记,此外还要在开一个cover表示当前结点一下是否都为同一高度代码:#include #include #include using namespace std;#define原创 2014-07-30 21:17:45 · 1358 阅读 · 0 评论 -
UVA 12299 - RMQ with Shifts(线段树)
UVA 12299 - RMQ with Shifts题目链接题意:给定一个数组,两种操作,每次query操作输出区间最小值,每次shift操作把选中位置每个位置向左移一位,最左的到最后去思路:线段树,shift操作中位置个数不会超过30个,那么直接当作点修改来做,那么就变成了简单的线段树了代码:#include #include #include u原创 2014-07-30 17:38:54 · 1323 阅读 · 0 评论 -
HDU Wow! 4893 Such Sequence!(线段树)
HDU 4893 Wow! Such Sequence!题目链接题意:给定一个序列,3种操作,单点添加值,查询区间和,把区间和变成最接近的婓波那契数思路:线段树,就是第三个操作麻烦,就在结点添加一个值,标记它区间是不是都是婓波那契数了,然后修改区间的时候,如果区间是了就不用修改,如果不是就继续往后一层推即可代码:#include #include #in原创 2014-07-29 19:47:35 · 838 阅读 · 0 评论 -
UVA 11983 - Weird Advertisement(线段树)
UVA 11983 - Weird Advertisement题目链接题意:给定几个矩形,之后,求覆盖k次以上的点思路:先把坐标离散化掉,然后把每个矩形x2,y1加一,这样就把求点转化为求面积,然后每个矩形拆分成上下两个线段,按y排序之后,从下往上每访问一条线段(第一条除外),答案就加上目前整条线段上次数大于等于k的长度乘上这条线段和上一条线段的高度差,然后再用这条线段,根原创 2014-08-03 14:30:50 · 1269 阅读 · 0 评论 -
UVA 1455 - Kingdom(线段树+并查集)
UVA 1455 - Kingdom题目链接题意:给定一些城市坐标点,连在一起的城市称为一个州,现在用两种操作,road表示把城市a,b建一条路,line表示询问一个y轴上穿过多少个州,和这些州共包含多少个城市思路:利用并查集维护每个州的上界和下界还有城市个数,然后每次加进一条路的时候,根据两个集合的位置可以处理出区间的州和城市数如何进行加减,然后利用线段树搞就可以了原创 2014-08-03 14:08:37 · 1224 阅读 · 0 评论 -
UVA 1400 1400 - "Ray, Pass me the dishes!"(线段树)
UVA 1400 - "Ray, Pass me the dishes!"题目链接题意:给定一个序列,每次询问一个[L,R]区间,求出这个区间的最大连续子序列和思路:线段树,每个节点维护3个值,最大连续子序列,最大连续前缀序列,最大连续后缀序列,那么每次pushup的时候,根据这3个序列去拼凑得到新的一个结点即可代码:#include #include原创 2014-07-29 00:02:35 · 1854 阅读 · 0 评论 -
HDU 5023 A Corrupt Mayor's Performance Art(广州网络赛B题)
HDU 5023 A Corrupt Mayor's Performance Art题目链接思路:线段树的区间修改区间查询延迟更新,每个结点存一个二进制数表示有哪些颜色即可代码:原创 2014-09-22 15:48:54 · 643 阅读 · 0 评论 -
UVA 1492 - Adding New Machine(线段树)
UVA 1492 - Adding New Machine题目链接题意:给定一些旧机器管辖范围,现在要放一台进新机器,新机器需要空间1*m,问有多少种放法思路:转化为求面积并的问题,先考虑横放,对于旧机器左边m个位置肯定不能放,还有边界w-m之后的位置肯定不能放,这样就可以把旧机器向左扩大m个位置,并且边界多上一块m*h大小的面积,这样求出这些面积并再用总面积减去即可,求面原创 2014-08-17 14:25:34 · 1246 阅读 · 0 评论 -
POJ 2777 Count Color(线段树)
POJ 2777 Count Color题目链接就一个线段树,颜色二进制表示就可以,成段更新成段查询延迟操作代码:#include #include #include using namespace std;#define lson(x) ((x<<1)+1)#define rson(x) ((x<<1)+2)const int N = 100005原创 2014-10-11 16:34:16 · 785 阅读 · 0 评论 -
POJ 3225 Help with Intervals(线段树)
POJ 3225 Help with Intervals题目链接集合数字有的为1,没有为0,那么几种操作对应就是置为0或置为1或者翻转,这个随便推推就可以了,然后开闭区间的处理方式就是把区间扩大成两倍,偶数存点,奇数存线段即可代码:#include #include #define lson(x) ((x<<1)+1)#define rson(x) ((x<原创 2014-10-11 13:25:21 · 724 阅读 · 0 评论 -
HYSBZ 2243 染色 (树链剖分)
HYSBZ 2243 染色题目链接树链剖分,关键在于线段树的维护,对于每个结点要记录下最左边和最右边的颜色,合并的时候,如果颜色相同那么颜色段要减1代码:#include #include #include #include using namespace std;const int N = 100005;int dep[N], fa[N], son原创 2014-10-02 18:50:23 · 1178 阅读 · 0 评论 -
POJ 3723 Tree(树链剖分)
POJ 3237 Tree题目链接就多一个取负操作,所以线段树结点就把最大和最小值存下来,每次取负的时候,最大和最小值取负后,交换即可代码:#include #include #include #include using namespace std;const int N = 10005;const int INF = 0x3f3f3f3f;int原创 2014-10-01 10:29:27 · 1055 阅读 · 0 评论 -
UVA 12436 - Rip Van Winkle's Code(线段树)
UVA 12436 - Rip Van Winkle's Code题目链接题意:区间修改一个添加等差数列,一个把区间设为某个值,然后询问区间和思路:关键在于等差数列的地方,线段树的每个结点添加一个首项和公差,由于等差数列加上一个等差数列还是一个等差数列,利用这个性质就可以进行维护了,注意set操作会覆盖掉等差数列的操作代码:#include #includ原创 2014-10-10 15:17:35 · 1212 阅读 · 0 评论 -
POJ 2736 Housewife Wind(树链剖分)
POJ 2763 Housewife Wind题目链接就树链剖分。。不过这题坑ector啊!, vector居然超时代码:#include #include #include #include using namespace std;#define lson(x) ((x<<1)+1)#define rson(x) ((x<<1)+2)typede原创 2014-09-30 20:11:15 · 1114 阅读 · 0 评论