随笔分类 -  数据结构--主席树

摘要:"传送门" 解题思路 比较神仙的一道题。首先计算答案时可以每条路径所包含的路径数,对于$x,y$这条路径,可以在$x$这处开个$vector$存$y$,然后计算时只需要算这个路径上每个点的$vector$中的元素是否也在这条路径上。这个可以用主席树维护,主席树维护括号序列,进时$+1$,出时$ 1$ 阅读全文
posted @ 2019-02-14 14:59 Monster_Qi 阅读(491) 评论(0) 推荐(0)
摘要:"传送门" 解题思路 首先对于一个$a$来说,要求$b$和$c$,那么$a,b,c$一定在一条链上。把$b$分类讨论,如果$b$是$a$的祖宗,这个方案数就很好统计了,就是$c$在$a$的子树里随便选,产生的贡献为$(siz_a 1) (min(k,dep_a))$。如果$b$是$a$的儿子,那么就 阅读全文
posted @ 2019-01-22 10:54 Monster_Qi 阅读(214) 评论(0) 推荐(0)
摘要:"传送门" 解题思路 如果区间内没有$1$,那么答案就为$1$,从这一点继续归纳。如果区间内有$x$个$1$,设区间内$[2,x+1]$的和为$sum$,如果$sum=0$,那么答案为$x+1$,否则$[1,x+sum]$中的所有数字一定可以被表示,然后这个操作每次使答案至少扩大$1$倍,再用一个主 阅读全文
posted @ 2019-01-11 11:23 Monster_Qi 阅读(119) 评论(0) 推荐(0)
摘要:"传送门" 解题思路 首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为 1,然后就和GSS1那样统计答案。但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做了。以$rt[i]$为根线段树维护二分的答案为$i$的线段树,线段树下标是位置。处理的时候就排一 阅读全文
posted @ 2019-01-11 09:14 Monster_Qi 阅读(214) 评论(0) 推荐(0)
摘要:"传送门" 解题思路 给每一时刻建一棵线段树维护当前时刻的值,然后修改的时候直接修改,查询的时候直接查,记住查询完后一定要复制。 代码 cpp include include include include include using namespace std; const int MAXN = 阅读全文
posted @ 2018-11-15 00:34 Monster_Qi 阅读(126) 评论(0) 推荐(0)
摘要:"传送门" 解题思路 主席树模板题,主席树就是一个支持查询历史版本的数据结构,就是在原树的基础上只修改那些受影响的部分以保证时空复杂度。做法就是首先离散化,然后给每个值建一棵线段树,每次建在上一个的基础上,然后查询的时候就变成前缀和相减的形式。时间复杂度$O(nlogn)$。 代码 cpp incl 阅读全文
posted @ 2018-11-15 00:31 Monster_Qi 阅读(121) 评论(0) 推荐(0)