随笔分类 -  线段树

摘要:线段树合并的话这个noip最难题就是个裸题了。 注意merge最后return x,以及如果需要区间查询的话这里还需要up,无数次死于这里。 阅读全文
posted @ 2018-10-10 20:36 Gloid 阅读(170) 评论(0) 推荐(0)
摘要:每个节点被经过的概率即为该区间和/总区间和。那么所需要计算的东西就是每个节点的平方和了。修改对于某个节点的影响是使其增加2sum·l·x+l2x2。那么考虑对子树的影响,其中Σl2是定值,修改后Σsum·l会增加Σl2x。维护一下就好。 懒得纠结爆long long的问题了,被卡90算了。 阅读全文
posted @ 2018-10-10 02:34 Gloid 阅读(214) 评论(0) 推荐(0)
摘要:考虑固定左端点,求出该情况下能获得的最大值。于是每次可以在某数第一次出现的位置加上其价值,第二次出现的位置减掉其价值,查询前缀最大值就可以了。每次移动左端点在线段树上更新即可。 阅读全文
posted @ 2018-10-02 16:13 Gloid 阅读(141) 评论(0) 推荐(0)
摘要:显然可以dp:设f[i]为前i个人最多能分多少组,则f[i]=max{f[j]}+1 (cmax<=i-j<=dmin)。 容易发现d的限制是一段连续区间,二分或者随便怎么搞都行。c则有点麻烦,考虑分治。找到区间中c最大的位置,处理左边区间再向右边(包括该位置)转移,最后处理右边区间(当然就是cdq 阅读全文
posted @ 2018-10-02 14:55 Gloid 阅读(453) 评论(0) 推荐(0)
摘要:考虑对于每一个点维护子树内与其连通的点的信息。为了换色需要,记录每个点黑白两种情况下子树内连通块的大小。 查询时,找到深度最浅的同色祖先即可,这可以比较简单的树剖+线段树乱搞一下(似乎就是qtree3),具体的,可以维护一下区间是否全黑/白,线段树上二分。换色会造成一个连通块分裂并产生新连通块,这只 阅读全文
posted @ 2018-09-29 03:15 Gloid 阅读(208) 评论(0) 推荐(0)
摘要:直接维护选k个子段时的最优解似乎也可以做,然而复杂度是O(nk2logn),显然跑不过。 考虑一种费用流做法。序列里每个点拆成入点和出点,源连入汇连出,入点和出点间连流量1费用ai的边,相邻点出点向入点连流量1费用0的边,整体限流k。 直接跑当然还不如暴力。观察一下这个做法是在干啥:每次选择费用最大 阅读全文
posted @ 2018-09-23 00:30 Gloid 阅读(422) 评论(0) 推荐(0)
摘要:考虑贪心,每次选价值最大的链。选完之后对于链上点dfs序暴力修改子树。因为每个点最多被选一次,复杂度非常正确。 阅读全文
posted @ 2018-09-19 22:30 Gloid 阅读(164) 评论(0) 推荐(0)
摘要:注意到等级的变化最多有nm次。于是考虑比较暴力的做法,线段树维护每个区间内每个等级角色的最大经验值,区间加时看有没有可以升级的,如果有则暴力向两边递归,否则打上标记。复杂度O(nmlogn)。 似乎有更优的做法。 阅读全文
posted @ 2018-09-15 17:13 Gloid 阅读(167) 评论(0) 推荐(0)
摘要:考虑暴力树剖。那么修改路径和查询子树最小值非常简单。 对于换根当然不能真的给他转一下,我们只记录当前根是哪个。对于查询,如果查询点不在当前根到原根的路径上,显然换根是对答案没有影响的;如果是当前根,答案就是整棵树最小值,否则即是要查询该路径上的后代所在子树外的点的最小值,去掉这段区间就可以了。 阅读全文
posted @ 2018-09-14 13:37 Gloid 阅读(124) 评论(0) 推荐(0)
摘要:动态图的连通性当然是可以用LCT维护的。但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢。 考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径)。查询时考虑几种绕来绕去的情况。 剩下的是大讨论。 阅读全文
posted @ 2018-09-12 13:45 Gloid 阅读(157) 评论(0) 推荐(0)
摘要:一个比较显然的做法:对每棵子树用线段树维护其中的深度,线段树合并即可。 本来想用这个题学一下dsu on tree,结果还是弃疗了。 阅读全文
posted @ 2018-08-19 21:01 Gloid 阅读(213) 评论(0) 推荐(0)
摘要:某两个点间的请求只对不在这条路径上的询问有影响。那么容易想到每次修改除该路径上的所有点的答案。对每个点建个两个堆,其中一个用来删除,线段树维护即可。由于一条路径在树剖后的dfs序中是log个区间,所以其补集也是log个区间。 然而由于复杂度是O(nlog3n)的以及蒟蒻自带大常数,在luogu上T了 阅读全文
posted @ 2018-08-16 01:51 Gloid 阅读(160) 评论(0) 推荐(0)
摘要:先不考虑换根。考虑修改某个点权值对答案的影响。显然这只会改变其祖先的子树权值和,设某祖先原子树权值和为s,修改后权值增加了x,则对答案的影响为(s+x)2-s2=2sx+x2。可以发现只要维护每个点到根的路径的子树和之和就可以了,随便树剖一波。 对于换根,可以发现这也只会改变其祖先的子树权值和。设原 阅读全文
posted @ 2018-08-15 13:45 Gloid 阅读(162) 评论(0) 推荐(0)
摘要:显然这形成了一个树形结构。考虑这样一种贪心:按照曲目顺序,每次取消其父亲的预留,并选择当前可选择(保证其子树有合法选择且满足预留)的最大值,然后对其子树预留出大于等于他的一些值。这个做法显然是正确的。问题在于怎么达到预留的效果。 离散化后建一棵权值线段树。线段树每个节点维护这段权值其右边(即大于该权 阅读全文
posted @ 2018-08-06 14:21 Gloid 阅读(300) 评论(0) 推荐(0)
摘要:可以发现这个写挂的树状数组求的是后缀和。find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和。也就是说,若结果正确,则a[l-1]=a[r](mod 2)。 一个很容易想到的思路是线段树维护每一位为1的概率。然而这其实是不对的,因为每一位是否为1 阅读全文
posted @ 2018-08-04 17:37 Gloid 阅读(223) 评论(0) 推荐(0)
摘要:首先把每32位压成一个unsigned int(当然只要压起来能过就行)。如果不考虑进/退位的话,每次只要将加/减上去的数拆成两部分直接单点修改就好了。那么考虑如何维护进/退位。可以发现进位的过程其实就是将一段连续的inf改为0,并把之后一位+1,也就是说只要找到某一位之后第一个不是inf的位就好了 阅读全文
posted @ 2018-08-01 13:31 Gloid 阅读(140) 评论(0) 推荐(0)
摘要:一个很显然的思路是把边按时间段拆开线段树分治一下,用lct维护MST。理论上复杂度是O((M+Q)logNlogQ),实际常数爆炸T成狗。正解写不动了。 阅读全文
posted @ 2018-07-29 20:15 Gloid 阅读(287) 评论(0) 推荐(0)
摘要:易知所求的是两棵子树大小的乘积。先建出最后所得到的树,求出dfs序和子树大小。之后考虑如何在动态加边过程中维护子树大小。这个可以用树剖比较简单的实现,但还有一种更快更优美的做法就是线段树合并。对每个点开权值线段树,维护当前时刻这棵点为根的子树中,已经和其相连的点的dfs序情况。合并时直接将表示两棵子 阅读全文
posted @ 2018-07-29 15:16 Gloid 阅读(213) 评论(0) 推荐(0)
摘要:显然子树内的操作不会对子树外产生影响。于是贪心,若交换之后子树内逆序对减少就交换。 这个东西可以用权值线段树计算。操作完毕后需要对两棵权值线段树合并,这个的复杂度是两棵线段树的重复节点个数。那么总复杂度不太显然的是O(nlogn)。因为相当于把n个只有一个叶子的线段树合并在一起。 阅读全文
posted @ 2018-07-29 12:05 Gloid 阅读(188) 评论(0) 推荐(0)
摘要:把查询看做是在一条时间轴上。那么每条边都有几段存在时间。于是线段树分治就好了。 然而在bzoj上t掉了,不知道是常数大了还是写挂了。 以及brk不知道是啥做数组名过不了编译。 阅读全文
posted @ 2018-07-28 14:57 Gloid 阅读(258) 评论(0) 推荐(0)