随笔分类 -  数据结构--线段树

摘要:n<=100000的数列支持以下操作:一、区间加;二、区间赋值;三、查区间最大;四、查区间历史版本最大。 恶心死我了。。可能很水,但我调了半天。 错误!调了两天。 这里有一个棘手问题:历史版本。 首先不看赋值操作。记俩标记——区间加add和区间历史加标记pre。其中后者的含义是“从上一次这个区间标记 阅读全文
posted @ 2018-02-14 15:58 Blue233333 阅读(204) 评论(0) 推荐(0)
摘要:n<=50000个vector进行m<=50000次操作:1、一区间的vector插入一个数;2、查询一区间中的vector中的所有数的第k大。 方法一:普通线段树套权值线段树!…… 方法二:单个询问是可以二分的,那就整体二分吧。这次是用线段树维护,把所有数字反过来求第k小再反过来就是第k大,注意5 阅读全文
posted @ 2018-01-08 07:36 Blue233333 阅读(179) 评论(0) 推荐(0)
摘要:给n<=50000个longlong范围内的可正可负的数字问下面式子的最大值: $f(l,r)=(a_l,a_{l+1},...,a_{r-1},a_r)(\sum_{i=l}^{r}a_i-max(a_l,a_{l+1},...,a_{r-1},a_r))$。 注意到括号里那坨区间和-区间最大值在 阅读全文
posted @ 2018-01-05 11:12 Blue233333 阅读(159) 评论(0) 推荐(0)
摘要:n<=500000的数字,问有多少个区间的众数出现次数严格大于区间长度的一半。 这么说来一个区间就一个众数了,所以第一反应是枚举数字,对下标进行处理。然后没有第二反应。很好。 在枚举一个数字的时候,可以把这个数字出现的位置记+1,没出现的位置记-1,实际就是问现在这个数组有多少个区间和>0,就是问对 阅读全文
posted @ 2017-12-28 22:09 Blue233333 阅读(281) 评论(0) 推荐(0)
摘要:n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物;查询熟食中编号最小的并删除之;查询是否有编号为id的食物,如果有查询是否有编号为id的熟食,如果有熟食删除之,否则输出其离煮熟的最小时间;查询编号在[L,R]的熟食有多少。保证操作时间递增。 可以发现:针 阅读全文
posted @ 2017-12-25 07:14 Blue233333 阅读(207) 评论(0) 推荐(0)
摘要:n<=200000个<=200000的数问所有的f(i,j)的和,表示去掉区间i到j后的剩余的数字中任选两个数的最大gcd。 数论日常不会。。 先试着计算一个数组:Hi表示f(l,r)<=i的(l,r)的数量。这样答案就是i*(H_i - H_i-1)的和。要求删掉某个区间后剩余的区间的最大gcd, 阅读全文
posted @ 2017-12-20 19:21 Blue233333 阅读(478) 评论(0) 推荐(0)
摘要:n<=1e5个点,每个点有排名,m次连接把某两个岛屿连起来,然后q次操作:合并两个岛屿;查询某个岛屿能到的所有岛屿的第k名次是哪一个。 线段树合并,并查集! 小坑:合并两棵线段树之前,记得判断这两棵树是不是已经在一起了,如果是就不理他; 合并线段树用的是并查集根节点对应的线段树。 1 #includ 阅读全文
posted @ 2017-10-25 07:33 Blue233333 阅读(130) 评论(0) 推荐(0)
摘要:n<=100000的点权树,问每个点子树内有多少个比他大。 方法一:区间第K大!…… 方法二:线段树合并,值为下标,每次把所有的孩子和自己合并起来,然后线段树中直接查找即可。 1 #include<cstring> 2 #include<cstdlib> 3 #include<cstdio> 4 / 阅读全文
posted @ 2017-10-24 19:58 Blue233333 阅读(135) 评论(0) 推荐(0)
摘要:n<=3e5的数列,m<=3e5个操作:把第x个数修改成y,或询问从x到y这个区间能否构成公差z的等差数列。 二逼做法:考虑一个序列在什么情况下才能构成公差z的等差数列。 首先,最大值和最小值的差是z*(y-x)。 其次,相邻两数的差的gcd是z。 再者,没有重复的数字。 前两个比较好搞,线段树,第 阅读全文
posted @ 2017-10-20 08:01 Blue233333 阅读(245) 评论(0) 推荐(0)
摘要:n<=1e5的有根点权树,m<=1e5个操作:换根,修改点权,查询子树最小值。 维护子树信息--dfs序,至于换根只需要分类讨论一下现在根和查询点的关系。 如果查询的点是根节点,就输出整颗树的最小值。 如果查询的点5在1到7的路径上,那以7为根的时候查询5,就是整颗树排除粉红色部分--5的儿子中,是 阅读全文
posted @ 2017-10-19 10:55 Blue233333 阅读(496) 评论(0) 推荐(0)
摘要:n<=100000栋楼房,第i栋在位置i,一开始全没建成高度0,m<=1e5个操作,每次操作把一栋楼x的高度修改为y,并问这次修改后从0位置往右边看能看到多少栋楼。他能看到一栋楼,必须这栋楼有高度,并且设楼高度Hi,那么(0,0)到(i,Hi)这条线段上没有其他的楼。1<=y<=1e9 说半天就是维 阅读全文
posted @ 2017-10-18 19:51 Blue233333 阅读(234) 评论(0) 推荐(0)
摘要:n<=1e5个点的树有边权,m个询问,每次问max dis(i,j) a<=i<=b,c<=j<=d。 结论:一个区间的最远点对,要么是其左半区间的最远点对,要么是其右半区间的最远点对,要么是左右半区间最远点对的四个点的互相组合之一。如下图: 两个集合最远点对分别是A-B,A并B的最远点对是红A-蓝 阅读全文
posted @ 2017-10-10 22:08 Blue233333 阅读(438) 评论(0) 推荐(0)
摘要:n<=1e5个数字,做m<=1e5次操作:把第Li到Ri的数字升序/降序排,求最后第Q位的数字。 似乎没有什么数据结构可以做这个?但可以转判定性问题。就是说,把一段数排序是没法的,但把一个01串排序是可以线段树乱搞的。 所以二分一个答案,比它小(等)的数都记0,比它大的都记1,如果最后第Q位0就没毛 阅读全文
posted @ 2017-10-07 21:50 Blue233333 阅读(186) 评论(0) 推荐(0)
摘要:n<=1000000个数互不相同,我回答m<=25000个询问说Li到Ri最小值是Xi,求最早第几次答得互相矛盾。 首先找到矛盾的情况:一是两个无交区间最小值相同,二是大区间最小值比它子区间的最小值大。 方法一:二分答案,每次看一段里面有没有这两种冲突。先把询问按Xi排个序扫一次就知道有没有冲突一, 阅读全文
posted @ 2017-09-08 12:28 Blue233333 阅读(295) 评论(0) 推荐(0)
摘要:n<=300000个点的树,给m<=300000条带权路径(ui,vi,保证vi是ui的祖先)求覆盖整棵树每条边的最小权和。 好题好姿势!直观的看到可以树形DP,f[i]表示把点i包括它爸爸下面那条边都覆盖的最小权,就用经过他爸爸那条边的所有路径,各条路径加上一些子树信息来更新即可。 这样时间炸,那 阅读全文
posted @ 2017-09-05 18:52 Blue233333 阅读(448) 评论(0) 推荐(0)
摘要:n<=20000个车站,车能同时载C<=100个人,求能满足K<=50000群人的多少个。每群人给起点终点和人数,一群人不一定要都满足。 一开始想DP,想不出,很菜。 贪心即可。如果有右端点相同的几群人,那肯定优先满足左端点大的;如果有两群人发生冲突,而我们从左到右考虑区间的话,那肯定让左边的人先满 阅读全文
posted @ 2017-08-31 10:11 Blue233333 阅读(185) 评论(0) 推荐(0)
摘要:n个数字中,每个数有数字A和属性B,每次操作将某个点x的属性B改变为0或1,求满足这样要求的子序列的个数: 下标a<b<c<d<e,而Aa<=Ab=Ac=Ad>=Ae且Bb=Bc=Bd=1。 区间操作,首推线段树!(然后就不会了,跑去看别人的代码) 是这样的,重点在于中间那三个点,因为我们的修改操作 阅读全文
posted @ 2017-07-18 00:01 Blue233333 阅读(193) 评论(0) 推荐(0)