
线段树
Roll_Keyboard
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job (dfs序+线段树)
题意:给你一颗有n个节点的树(根为节点1),每个节点有两种状态,点亮或者没点亮,现在给你每个节点的初始状态和它的父节点,然后进行q次操作,操作有两种,一种是查询某个几点下的子树有多少个亮着的节点,另一种是修改某个节点下的子树的所有节点的状态(就是没点亮变为点亮,点亮变为没点亮)思路:首先连边,然后对这棵树进行dfs,并且每个节点都会有一个dfs序的编号,并且由于是dfs序,那么他的子节点的dfs序都原创 2017-10-31 15:49:06 · 292 阅读 · 0 评论 -
HDU 1542 Atlantis(线段树扫描线)
题意:计算一堆长方形面积思路:线段树扫描线模板 以前手动去重,现在用STL写了一次,感觉好看多了错误及反思:PE和多组代码:#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<原创 2018-02-06 16:00:49 · 359 阅读 · 0 评论 -
HDU 3265 Posters (线段树扫描线)
题意:给你一群长方形边框,计算总面积思路:对于一个长方形边框,我们可以很简单地把它切割成四个标准的长方形,那么接下来就和普通扫描先没什么区别了 这里如果你想把中间的长方形反向标记,会非常麻烦,首先lazy的状态极难表示,每次都要被迫地更新到更下面,这样lazy能节省的时间会少很多,很容易TLE,所以与其纠结反向标记,不如直接拆开更好写错误及反思:会爆int,longlong能AC,不是很懂dicu原创 2018-02-06 16:10:32 · 246 阅读 · 0 评论 -
UVA 11983 Weird Advertisement (线段树扫描线)
题意:现在在坐标系上,画正方形,问重叠k次及以上的区域里面有几个点(都在第一象限)思路:扫描线比较有意思的一个题目 首先,要把计算点个数变成计算面积,我们把一个点看成一个格子,因为都在第一象限,那么只要把每个长方形右上角的坐标各加一即可,这样计算出的面积就是答案了 现在的问题就成了如何计算k次及以上的面积了,首先我们不可能不断地pushdow来更新区域面积,肯定会T。我们发现题目中k最大只有10原创 2018-02-15 12:46:44 · 259 阅读 · 0 评论 -
Codeforces Round #336 (Div. 1) D. Power Tree(dfs序线段树)
题意:思路: 首先,直接模拟很不现实,只能先离线,造出空树,再慢慢更新树 那么现在想一下怎么维护这颗树,首先,我们算每个点对根节点的贡献,发现每个点的贡献可以表示为vi∗sz1∗sz2∗...∗v_i*sz_1*sz_2*...*(其中sz1,sz2是这个点和根节点的路径上的点,这些点的直接儿子),只要我们新加入一个节点,假设父亲的直接儿子节点个数为sz,那么这次修改就是把它父亲原创 2018-05-08 19:31:26 · 349 阅读 · 0 评论 -
bzoj 1503 郁闷的出纳员 (权值线段树或splay)
题意:思路: 因为工资修改值最多只有1e5,初始工资1e5+修改的2e5,那么其实我们只要开3e5的权值线段树就能维护了。对于加减钱,我们只要修改标准即可,对于加入人,只要让他的初始工资补上之前修改过得标准即可,而查询第k大,就是正常操作了。 为了方便操作,我们让初始工资钱成为1e5+1,...原创 2018-05-22 18:59:13 · 360 阅读 · 0 评论 -
bzoj 1018 堵塞的交通traffic (线段树)
题意:思路:参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 非常非常难写的线段树,不仅难想还难写。 首先,这个线段树维护的是什么,是该区域四个顶点的连通性 ...原创 2018-07-24 15:26:51 · 835 阅读 · 0 评论 -
spoj GSS4 Can you answer these queries IV (线段树)
题意:思路: 套路题,因为在根号几次以后,继续根号就没有意义了,利用这一点就能AC了错误及反思:代码:#include<bits/stdc++.h>using namespace std;#define lson l,m,rt<<1#define rson m+1,r...原创 2018-07-24 15:30:17 · 463 阅读 · 0 评论 -
Codeforces Round #104 (Div. 1) E. Lucky Queries (线段树)
题意: 长度为n的47串,两种操作,一种是区间变换,即4变7,7变4,一种是询问,问最长的非严格递增子序列长度思路: 线段树维护即可,47可以抽象成01串,变换就是异或,存储全0串最长长度,全1串最长长度,000..111串长度,111…0...原创 2018-07-20 13:41:01 · 484 阅读 · 0 评论 -
bzoj 1103 大都市meg (dfs序+线段树)
题意: 一颗树,每条边权是1,两种操作,一种查询x到根的距离,一种把某边改为0思路: 对于一个边变了,那么影响的就是子树,所以dfs序+线段树就行了,这题对于时间要求很低,vector存边,每次暴力找答案也能A错误及反思:代码:...原创 2018-07-20 14:13:51 · 385 阅读 · 0 评论 -
HDU 1828 Picture (线段树扫描线)
题意:给你一堆长方形,求周长和思路:懒得思考就当码农!! 我们正常扫一次,比如平行于x轴向上扫描,我们不断用pre减去目前总长,这样弄完就是平行于x轴的周长和,可是处理y轴的时候,我们不能单纯的每次每次加上两段y的差值,因为我们并不知道有几段y,正常做法是维护有多少段x,这样就知道了这个区间对应了多少段y。可是这涉及了区间合并,好麻烦。。。那么我们强行再平行y轴扫一次就好了!!! 代码看着很长,原创 2018-02-06 15:56:45 · 282 阅读 · 0 评论 -
HDU 1540 Tunnel Warfare(线段树区间合并)
题意:现在有n个点,要进行一些操作,第一种是破坏某个点,第二个询问某个点所处的最长连续没破坏的区间长度,第三种修复最后一个被破坏的点思路:简单的区间合并 对于破坏和修复,是简单的单点修改,因为要修复最后一个,可以维护一个栈来方便记录一下,那么这个题需要思考的地方就只有怎么想最大区间了,我们可以这么想,如果这个点存在于我左右儿子的交界处,那么就可以直接输出这段的长度,否则,我们就要看这个点是处于我左原创 2018-02-06 13:51:08 · 254 阅读 · 0 评论 -
BZOJ 3289 Mato的文件管理(莫队+线段树/树状数组)
题意:思路:莫队+逆序数,思路还是很好想的,但是复杂度要纠结下。 对于[L,R]来说,向右边扩展,即变成了[L,R+1],就相当于只是在数组末端多了一个数,其他的操作也是同理,只要遵循,改变区间的时候,加上/减去比自己大的值即可 复杂度是莫队的o(nn‾√n\sqrt{n})乘以树状数组或者线段数查询的一个o(log(nn‾√)log(n\sqrt{n}))错误及反思:题目原创 2017-12-12 14:49:57 · 409 阅读 · 0 评论 -
POJ 3225 Help with Intervals(线段树)
题意:官方有中文思路:首先要处理括号的问题,那么我们就可以离散下坐标,让每个坐标扩大两倍来表示,这样就能解决括号的问题了。 U:把区间[l,r]覆盖成1 I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0 C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换 S:[l,r]区间0/1互换 线段树的值1,0表示这一段全为0或者1,-1表示无法确定,只要加一个原创 2018-01-31 16:21:48 · 211 阅读 · 0 评论 -
POJ 2528 Mayor's posters (线段树+离散)
题意:往高度为1的广告牌上贴广告,广告之间能覆盖,问最后能看见几个思路:复习线段树就又写一遍,发现用STL离散和补点非常方便,就是跑得满了很多错误及反思:代码:#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;#define lson l,m,rt<<1#defi原创 2018-01-29 10:02:44 · 238 阅读 · 0 评论 -
HDU 2871 Memory Control (线段树区间合并)
题意:现在有一个内存条,有四操作,第一种是用掉一段内存,从左向右找第一个能插的地方插,并输出位置,没有就输出“Reject New”,第二种是清空某个位置所处的内存段,并输出左右边缘,没有就输出“Reject Free”,第三种是清空全部内存,第四种是得到第k块内存的信息思路:很麻烦的区间合并错误及反思:这题百度到的题解有的是错的,因为这个题数据不行,很多人用vector暴力地原创 2018-02-05 23:05:37 · 333 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments(线段树)
题意:给你一堆平行于y轴的线,如果两条线之间能够有一条平行于x轴的线直接相连,就说这两条线是可见的,现在给你n条线,问有多少组线,每组要求三条且两两可见思路:首先离散所有y轴的点,然后按照x轴排序,这样我们不断地更新线段树,每次先看看能看到那些线段,再把当前这条线更新进去,就能知道某条线与哪些其他线两两可见,最后暴力地看有多少组即可(虽然最差的时候我们我们每次查询都要查到最下面,但是因为时间限制比较原创 2018-02-05 23:13:30 · 228 阅读 · 0 评论 -
POJ 2991 Crane (线段树+数学)
题意:给你一个机械臂,每次操作某个节点,改变它的度数,问机械臂每次操作完后末端的坐标思路:首先,要求最后一个点的坐标,我们可以把机械臂每段都看作一个向量,如果所有向量都首尾相连且都指向末端,那么我们最后横坐标的和,纵坐标的和就分别是机械臂的x坐标和y坐标了而我们每调整某个角度,我们能发现,对于后面每个点都能够产生一定的影响,每个角度的变化是一样的,但是因为长度不同,所以对坐标的影响不同,那么我们只要原创 2018-02-05 23:21:06 · 327 阅读 · 0 评论 -
POJ 3667 Hotel (线段树区间合并)
题意:一个旅店,有n个房间,接下来会住进一些人,每个人要一段连续的房间,如果有多个,要编号最小的,同时也可能会出去一些人,每次都是出去一个区间的人思路:区间合并的模板题 区间合并其实很简单,以前我们对于父亲更新儿子,会用lazy来减少操作。用儿子更新父亲,也只是一些很简单的相加什么的,区间合并,是因为儿子对父亲产生的影响变得更加复杂,比如这个题目,左右儿子都需要维护的是区间,而在合并的时候,左右儿原创 2018-02-05 23:31:56 · 221 阅读 · 0 评论 -
HDU 3308 LCIS(线段树区间合并)
题意:给你一个序列,现在进行一些操作,一种是询问某一段最长连续上升子序列(LCIS)的长度,另一个就是修改某个点的值思路:区间合并的简单题 这里的区间合并,要判断的是左儿子最右边的值和右儿子最左边的值的关系,那么我们这道题要维护的东西就有:最左端开始的LCIS,包括最右端的LCIS,该区间的LCIS,最左边的值,最右边的值(最后这两个不需要维护,也很好求,我只是为了方便写顺便写到lsum和rsum原创 2018-02-05 23:38:37 · 236 阅读 · 0 评论 -
HDU 3397 Sequence operation(线段树区间更行)
题意:给你一个01的串,有五种操作,第一种,将某个区间覆盖成0,第二种,将某个区间覆盖成1,第三种,将某个区间取反(即0变1,1变0),第四种,问某个区间1的个数,第五种,问某个区间最长连续的1的长度思路:超级超级超级麻烦的区间更新 首先,对于1,2,4操作,都是基础线段树的操作,5是基础区间更新的操作,但是此时多了一个3操作,导致写起来直接麻烦了很多 首先因为有异或和区间覆盖,我原创 2018-02-06 08:38:22 · 377 阅读 · 0 评论 -
Codeforces 85D. Sum of Medians (线段树)
题意: 三种操作,1.加入一个数,2,删除一个数,3,询问经过排序以后,所有下标mod5mod5mod5余3的数的和思路: 注意到,当我们加入一个数以后,会让所有后面的数后移一位,删除会使得后面全部前移一位,每次移动都使得下标变化1,所以我...原创 2018-07-20 16:45:41 · 568 阅读 · 0 评论