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

1 2 3 4 5 ··· 7 下一页
摘要:考场的时候智障了,写了 6k+ 的树链剖分. 如果题目带修改的话可以用树链剖分来维护,但由于没有修改用一个前缀和其实就够了. 求 $\sum_{i=l}^{r} f(a,i)$ 可以写成两个前缀相减的形式. 然后我们就要求 $\sum_{i=0}^{r} f(a,i)$. 求这个的话用倍增讨论 $a 阅读全文
posted @ 2020-08-14 09:37 EM-LGH 阅读(257) 评论(0) 推荐(0)
摘要:一个比较暴力的解法. 先对所有串建出广义后缀自动机提取出后缀树然后按照询问的右端点离线. 考虑插入第 $i$ 个串,那么会被 $i$ 及 $i$ 的祖先遍历到的点的表示范围会从 $[l,r] \rightarrow [l,r+1]$. 未被遍历到的点的表示范围出现了一个“断点”,则表示范围就是 $i 阅读全文
posted @ 2020-08-10 08:54 EM-LGH 阅读(187) 评论(0) 推荐(0)
摘要:比较好的一道数据结构题. 对于 $i$,我们希望求出所有经过 $i$ 号点的路径所构成的树链之并. 考虑一个求解树链的并的经典做法就是 $\sum_{i=1}^{n} dep[i]-\sum_{i=2}^{n} dep[LCA(i,i-1)]$. 这里要求所有点都要按照 $dfs$ 序排好. 那么这 阅读全文
posted @ 2020-08-04 22:25 EM-LGH 阅读(189) 评论(0) 推荐(0)
摘要:比较好的一道题 DP 题. 令 $f[i][j]$ 表示覆盖前 $i$ 个基站且 $i$ 位置上维修了基站的最小代价. 注意:上面设的状态是不考虑 $[i+1,n]$ 的. 转移的话 $f[i][j] \leftarrow f[k][j-1]+calc(j-1,i)$. 其中 $calc(i,j)$ 阅读全文
posted @ 2020-07-29 16:58 EM-LGH 阅读(171) 评论(0) 推荐(0)
摘要:裸做的话是 $O(n \log^2 n)$ 的,即将 $a$ 进行二进制拆分,然后暴力更新. 考虑进行压位,即线段树的每一个叶节点维护长度为 $30$ 的状态. 加法操作如果需要进位的话就找到其后面的块中第一个 0 所在位置. 减法操作如果需要借位的话就找第一个 1. 第一个 0 与第一个 1 都可 阅读全文
posted @ 2020-07-27 20:48 EM-LGH 阅读(164) 评论(1) 推荐(0)
摘要:线段树加 hash 判重模板题. hash 的话必须要用双 base 哈希,否则会 WA. 然后这道题中最好不要用自然溢出,感觉比取模还要慢一些. 由于读入量巨大,必须要开读入优化才能过. 哈希的方式就是对于每个数维护 $\sum base^{num[i]}$,由于值域不大,提前预处理出来 base 阅读全文
posted @ 2020-07-27 08:06 EM-LGH 阅读(510) 评论(0) 推荐(0)
摘要:这道题卡常啊 ! 出题人说 $O(n \log^2 n)$ 可过,但我写了个 $O(n \log^2 n)$ 的树剖卡了半天常数. 最暴力的做法:枚举区间,然后跑一个树形DP 来求最小匹配. 显然,因为要求匹配值最小,所以一定是能匹配就先匹配. 也就是说递归完 $x$ 的所有儿子后,$x$ 的每一个 阅读全文
posted @ 2020-07-15 08:59 EM-LGH 阅读(198) 评论(0) 推荐(0)
摘要:这道题有 3 个操作: 1. 换根 2. 求 LCA 3. 子树修改/子树求和. 对于第一个操作,直接换根就行. 对于第二个操作,分这几种情况讨论:$x,y$ 都在以 1 为根,$rt$ 的子树中,$x,y$ 其中 1 个在子树中,$x,y$ 都不在子树中. 对于都在子树中的情况,答案即为 $lca 阅读全文
posted @ 2020-07-13 09:20 EM-LGH 阅读(154) 评论(0) 推荐(0)
摘要:刚开始想出了一个分治做法,但是比较麻烦,需要分 4 中情况讨论. 后来偷看了一眼标签发现是线段树,然后就想出了这个线段树做法. 考虑序列以 $r$ 为右端点的答案,有 $\sum_{l=1}^{i} max(l,i)-min(l,i)=i-l$. 其中这个条件可以写成 $max(l,i)-min(l 阅读全文
posted @ 2020-07-11 07:51 EM-LGH 阅读(218) 评论(0) 推荐(0)
摘要:可以将跳左/右/父亲抽象成二进制的形式. 跳左:x<<1 跳右:x<<1|1 父亲:x>>1 但是题中说如果跳到根节点之后再跳父亲编号仍然不变比较不好处理. 但是我们发现一个性质:令 $fl$ 表示一个区间能跳到最靠上的祖先,$path$ 表示跳到该祖先后向下跳的路径,答案一定可以表示成 max(1 阅读全文
posted @ 2020-07-10 09:13 EM-LGH 阅读(203) 评论(0) 推荐(0)
摘要:假设当前进行到操作 $m$. 1. 将区间 $[l,r]$ 每个数加上 $v$. 2. 询问当前区间 $[l,r]$ 的和. 3. 令 $S(l,r,x)$ 代表 $[l,r]$ 区间在时刻 $x$ 时之和,求 $\sum_{i=0}^{m} S(l,r,i)$. 题解: 对于一个区间,我们要求当前 阅读全文
posted @ 2020-07-09 16:09 EM-LGH 阅读(2051) 评论(1) 推荐(7)
摘要:根据期望的定义,我们可以求出所有情况之和再除以情况数量. 如果长度满足 $n=2^k$,线段树上一个节点新加 $v$ 的话 $v$ 的贡献就是 $v \times si[x]$,si[x] 即子树下叶节点个数. 如果长度不满足上述条件,由于线段树是完全二叉树结构,我们可以强制让深度小于最大深度的叶节 阅读全文
posted @ 2020-07-09 07:53 EM-LGH 阅读(172) 评论(0) 推荐(0)
摘要:题意:给定一个排列,每次有两种操作:1 区间降序排列 2 区间升序排列,求 m 才操作后 q 位置上的数字 这道题非常神仙啊. 假如说序列中只有 0,1 的话我们只需要用线段树维护 0,1的个数然后进行区间覆盖即可. 由于所有数互不相同,考虑二分 $q$ 点上的数 $mid$,然后将大于等于 $mi 阅读全文
posted @ 2020-07-05 08:11 EM-LGH 阅读(140) 评论(0) 推荐(0)
摘要:不难的一道字符串题. 建立 $T$ 的 SAM,然后根据 $S$ 中的询问按照右端点离线,依次在 $T$ 的 SAM 上匹配. 查询的时候分两种情况讨论一下,用线段树维护就行了. code: #include <cstdio> #include <cstring> #include <algorit 阅读全文
posted @ 2020-06-29 11:23 EM-LGH 阅读(133) 评论(0) 推荐(0)
摘要:由于只有取 max 标记,所以直接在线段树上维护就行. 然后取前 k 大的话就用一个堆来维护四元组 $(l,r,v,pos)$ 表示区间 $[l,r]$ 的最小值为 $v$ ,位置为 pos. 查询的时候按照 $v$ 递增的顺序取出堆顶,然后按照 pos 分裂,再扔回堆里就行了. code: #in 阅读全文
posted @ 2020-06-22 10:41 EM-LGH 阅读(193) 评论(0) 推荐(0)
摘要:这里写的是线段树套权值线段树和 set. 写代码的时间大概是 40 min,然后调试时间是 10 分钟左右,感觉这种数据结构题写的时候仔细检查的话还是比较好调的. code: #include <bits/stdc++.h> #define ll long long #define N 50009 阅读全文
posted @ 2020-06-10 20:56 EM-LGH 阅读(144) 评论(0) 推荐(0)
摘要:这题怕不是 sb 题吧,随便分类讨论一下 $i$ 乘不乘 2 倍就没了. 然后细节要注意一下:题中要求的是大于等于. 求值域在 $[L,R]$ 中的元素个数时我用的权值线段树,可能会比二分要慢一点,但是不用判边界. code: #include <bits/stdc++.h> #define ll 阅读全文
posted @ 2020-06-09 09:19 EM-LGH 阅读(128) 评论(0) 推荐(0)
摘要:离线,然后从后向前扫描,维护每一个时刻当前位置的后缀最小值. 我们发现依次修改影响的是时间线段树一段区间要取 min,这个用吉司机线段树维护就好了. 具体地,我们记录一个 tag 标记,然后下传条件是 mx[now]<mx[lson] 或 mx[now]<mx[rson]. 这道题卡常,最好不要用 阅读全文
posted @ 2020-06-08 16:10 EM-LGH 阅读(317) 评论(0) 推荐(0)
摘要:自己想出来的,还是相当开心的(说实话这题也不难 QAQ......) 首先,那个时间限制非常好处理:离线然后拆成插入和删除就行. 对于每一种元素的每一个位置维护一个 $pre_{i}$ 表示上一次出现的位置. 假设我们查询的位置是 $pos$,我们二分答案 $mid$. 如果 $mid$ 合法,就要 阅读全文
posted @ 2020-06-02 16:50 EM-LGH 阅读(196) 评论(0) 推荐(0)
摘要:如果进行了 $q$ 个操作,且这 $q$ 个操作都包含位置 $i$,则 $i$ 位置的值一定是最大值. 所以我们就可以按照区间进行线段树分治,然后拿 bitset 优化一下 $dp$ 即可. code: #include <bits/stdc++.h> #define N 10008 #define 阅读全文
posted @ 2020-06-01 08:37 EM-LGH 阅读(159) 评论(0) 推荐(0)

1 2 3 4 5 ··· 7 下一页