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

摘要:题解 把S串建一个后缀自动机 用一个可持久化权值线段树维护每个节点的right集合是哪些节点 求本质不同的子串我们就是要求T串中以每个点为结束点的串有多少在$S[l..r]$中出现过 首先我们需要对于T串每个点本身和自己的匹配长度,可以建一个后缀自动机来完成 然后把T串放在S串上跑匹配,匹配到下一个 阅读全文
posted @ 2019-07-10 20:20 sigongzi 阅读(561) 评论(0) 推荐(0)
摘要:LOJ 3094. 「BJOI2019」删数 之前做atcoder做到过这个结论结果我忘了。。。 em,就是$[1,n]$之间每个数$i$,然后$[i cnt[i] + 1,i]$可以放一条线段,没被线段放的地方就是需要改的数的总和 之后我们线段树维护区间最小值以及个数 我们要注意如果+1后使得一个 阅读全文
posted @ 2019-06-06 13:57 sigongzi 阅读(302) 评论(0) 推荐(0)
摘要:LOJ 3085. 「GXOI / GZOI2019」特技飞行 这显然是两道题,求$C$是一个曼哈顿转切比雪夫后的线段树扫描线 求$AB$,对向交换最大化和擦身而过最大化一定分别为最大值和最小值 对向交换最大化是每个点都对向交换 擦身而过最大化需要对向交换最小化,我们一次对向交换相当于交换任意两个数 阅读全文
posted @ 2019-06-04 21:51 sigongzi 阅读(275) 评论(0) 推荐(0)
摘要:LOJ 3046. 「ZJOI2019」语言 先orz zsy吧 有一个$n\log^3n$的做法是把树链剖分后,形成logn个区间,这些区间两两搭配可以获得一个矩形,求矩形面积并 然后就是对于一个点把树链的log个区间加进去然后线段树合并,这是$n \log^2 n$的 链并会形成一棵树,如果我们 阅读全文
posted @ 2019-06-04 11:24 sigongzi 阅读(440) 评论(0) 推荐(0)
摘要:LOJ 3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 cpp include define fi first define se second define pii pair de 阅读全文
posted @ 2019-05-31 21:22 sigongzi 阅读(408) 评论(0) 推荐(1)
摘要:LOJ 3034. 「JOISC 2019 Day2」两道料理 找出最大的$y_{i}$使得$sumA_{i} + sumB_{y_i} \leq S_{i}$ 和最大的$x_{j}$使得$sumA_{x_{j}} + sumB_{j} \leq T_{j}$ 然后我们相当于从$(0,0)$走到$( 阅读全文
posted @ 2019-05-31 14:02 sigongzi 阅读(872) 评论(0) 推荐(0)
摘要:LOJ 3043. 「ZJOI2019」线段树 计数转期望的一道好题…… 每个点设两个变量$p,q$表示这个点有$p$的概率有标记,有$q$的概率到祖先的路径上有个标记 被覆盖的点$0.5p + 0.5 \rightarrow p ,0.5q + 0.5\rightarrow q $ 被覆盖的点子树 阅读全文
posted @ 2019-05-31 07:32 sigongzi 阅读(337) 评论(0) 推荐(0)
摘要:题解 就是线段树维护一下转移矩阵 分成两种情况,一种是前面有两个联通块,一种是前面有一个联通块 从一个联通块转移到一个联通块 也就是新加一列的三个边选其中两条即可 从一个联通块转移到两个联通块 不连竖着的那条边,横着的两条边转移一条短的即可 从两个联通块转移到一个联通块 新加的一列三个边全连上 从两 阅读全文
posted @ 2018-12-19 15:46 sigongzi 阅读(331) 评论(0) 推荐(0)
摘要:题解 成功把自己写自闭了 离散化之后再二分我是真不会算坐标啊我这个zz 先离散化所有坐标,然后对于每个位置维护一个最小前驱,然后线段树区间维护最小前驱 什么?位置一样?那就给每个大小为1的位置开个multiset,往上维护的时候就直接左右区间取min 然后就是,在线段树上二分了 我们把正无穷和负无穷 阅读全文
posted @ 2018-12-17 19:50 sigongzi 阅读(306) 评论(0) 推荐(0)
摘要:题解 写后缀树真是一写就好久,然后调好久QAQ 我们把两个串取反拼一起建后缀树,这样的话使得后缀树是正串的后缀树 然后我们把询问挂在每个节点上,每次线段树合并,对于大于50的每次暴力跳着在线段树找,对于小于50的建出一棵树来,也就是$a[i][j]$表示第$i$位往后$j$位,向下一个$a[t][j 阅读全文
posted @ 2018-12-01 16:20 sigongzi 阅读(475) 评论(0) 推荐(0)
摘要:题解 老了,国赛之前敲一个后缀树上LCT和线段树都休闲的很 现在后缀树上线段树合并差点把我写死 主要思路就是后缀树+线段树合并+容斥,我相信熟练的OIer看到这已经会了但就是不想写 但是由于我过于老年化,我还是决定记录一下我的思路 我用后缀自动机建的后缀树,所以是反串的后缀树,我考虑的都是区间字符串 阅读全文
posted @ 2018-11-22 08:52 sigongzi 阅读(593) 评论(0) 推荐(0)
摘要:题解 每次开这样的数据结构题感想都大概是如下两点 1.为什么别人代码长度都是我的1/2???? 2.为什么我运行时间都是他们的两倍???? 简单分析一下,我们关注一个区间是否合法只关注这个区间有多少个1,有多少个0 有偶数个1,一定合法,因为3的二进制是11,我们只需要111111拼起来一定除得开3 阅读全文
posted @ 2018-11-18 19:22 sigongzi 阅读(474) 评论(0) 推荐(0)
摘要:"题面" 题解 转化一下可以变成所有小于等于r的减去小于等于l 1的 然后我们求小于等于x的 显然是 $\sum_{i = 1}^{n} \sum_{j = 1}^{min(i,x)} sum[i] sum[i j]$ 对于$[x,N x]$前缀和被加了$x$遍 对于$[1,N x]$前缀和被减了$ 阅读全文
posted @ 2018-11-18 11:00 sigongzi 阅读(585) 评论(0) 推荐(0)
摘要:"题面" 题解 考虑我肯定是从一个人出发,开始依次标记,而不会跳过某个人,因为如果我跳过了,那么我之后回来还需要标记它,比不上我等完它再一直走到最后(因为多了走一圈之后走回它的代价) 我们倍长整个序列,我们要求的就是 $Min_{i = 1}^{n}{Max_{j = i}^{i + n 1}{T_ 阅读全文
posted @ 2018-11-17 19:40 sigongzi 阅读(284) 评论(0) 推荐(0)
摘要:题解 我们转而维护每个点的斜率,显然一个楼房能被看见它就是一个前缀最大值,斜率比较为了节约精度可以用向量替代 我们每个区间维护被看到的楼房的个数,和楼房的最大值,叶子节点在有楼房时,值为1 那么考虑合并两个区间,左节点的所有能被看到的楼房还是能被看到,右边节点能看到的楼房的斜率需要大于左边节点所需要 阅读全文
posted @ 2018-11-05 20:27 sigongzi 阅读(252) 评论(0) 推荐(0)
摘要:题解 这道题维护方法比较简单,也有点奇妙 我们可以很容易求出经过所有点的路径条数,和初始时分子的大小 然后单点修改的时候,相当于给当前点$v$加上$delta (siz[v] 1)$ $v$到根的路径上每个祖先都要加上设$t$为$k$在路径上的儿子,$delta (siz[k] siz[t])$ 如 阅读全文
posted @ 2018-10-30 16:44 sigongzi 阅读(284) 评论(0) 推荐(0)
摘要:A Two Abbreviations 如果有最小答案的话这个答案一定是N和M的lcm 我们考虑一下什么情况下 $k \frac{L}{N} = h \frac{L}{M}$且$k,g$互质 显然是在$k = \frac{N}{gcd(N,M)},h = \frac{M}{gcd(N,M)}$的时候 阅读全文
posted @ 2018-10-17 17:36 sigongzi 阅读(443) 评论(0) 推荐(0)
摘要:题解 显然要记录每个点来的状态,这样会扩充出点度的平方条边,就gg了 删掉所有的点,把每个边拆成两个点,连一条边权为c 这个时候我们考虑对于原先的每个点,将所有与其相连边所需要的节点(不管是进入还是出去)建一棵虚树,然后用线段树优化建图,优化方法是枚举每个lca,然后将lca的每个子树和其他子树连一 阅读全文
posted @ 2018-10-03 19:51 sigongzi 阅读(379) 评论(0) 推荐(0)
摘要:题解 把所有的数组一开始就FWT好然后再IFWT回去可以减小常数 从13s跑到0.7s…… 可以参照immortalCO的论文,感受一下毒瘤的动态动态DP 就是用数据结构维护线性递推的矩阵的乘积 由于所有轻儿子$F(z) + z^{0}$的乘积做除法太麻烦,我们用一个线段树维护每个点所有的轻儿子即可 阅读全文
posted @ 2018-10-03 13:19 sigongzi 阅读(626) 评论(0) 推荐(0)
摘要:题解 写数据结构的时候我代码就会变得非常非常长 一看别人1.5K 2.3K 我6.3K…… orzzzzz 我们很容易想到离线倒着插入,然而,有个小锅叫如果size相同保持原来的重儿子不变 我们需要写个线段树,遇到两个size相同的儿子时看两个儿子下一次插入是什么时候,取下一次插入时间较大的儿子,如 阅读全文
posted @ 2018-08-29 10:15 sigongzi 阅读(233) 评论(0) 推荐(0)