随笔分类 -  线段树

摘要:对每一个位置 $i$,求出其上一次出现的位置 $pre_i$ 以及下一次出现的位置 $next_i$ 对一个询问来说,就是查询 $pre_i$ 在 $[0,l 1]$,$i$ 在 $[l, r]$,$next_i$ 在 $[r + 1, n + 1]$ 这个长方体内的最大值 那么可以用KD tree 阅读全文
posted @ 2020-03-05 22:59 Mrzdtz220 阅读(129) 评论(0) 推荐(0)
摘要:对于每一个左端点,考虑其右边那些能更新答案的点 先考虑在其右边且值比当前大的,小的可以将值翻转后做一遍 即对左端点 $i$,找到 $j i$ 满足 $a_j a_i$ 首先找到一个 $j$,下次在 $j$ 右边找到一个 $k$ 满足 $a_j a_k a_i$ 但是这样的点对还是有很多,考虑找下个 阅读全文
posted @ 2020-02-25 11:45 Mrzdtz220 阅读(99) 评论(0) 推荐(0)
摘要:解法一:整体二分 用支持区间加区间查询的bit可降低时空常数 阅读全文
posted @ 2020-02-17 11:02 Mrzdtz220 阅读(166) 评论(0) 推荐(0)
摘要:对于 $f_0=f_1=1$ 的斐波那契数列有一个性质 $$f_i=f_{i k} f_k+f_{i k 1} f_{k 1}, \forall k \in \left[1, i\right)$$ 数学归纳法证一下 当 $k=1$ 时,$f_i=f_{i 1} f_1+f_{i 2} f_0=f_{ 阅读全文
posted @ 2020-02-16 21:11 Mrzdtz220 阅读(100) 评论(0) 推荐(0)
摘要:看到期望就想期望的线性性 即求一条边在一个区间里经过多少次 把边权都转到左边的点上 查询和修改就都变成了对 $[l, r 1]$ 的查询和修改 令 $x=l,y=r 1$,那么一条边 $i$ 在区间 $[x,y]$ 里的贡献为 $$(i x + 1)(y i + 1)=(x+y)i \times v 阅读全文
posted @ 2020-02-14 21:18 Mrzdtz220 阅读(91) 评论(0) 推荐(0)
摘要:$dp[i][j]$ 表示走到 $(i,j)$ 的方案数 $dp[i][j] = \sum\limits_{x define mid ((l + r) 1) define lp tree[p].l define rp tree[p].r const int MOD = 1000000007; con 阅读全文
posted @ 2020-02-14 17:21 Mrzdtz220 阅读(108) 评论(0) 推荐(0)
摘要:线段树套线段树,即二维线段树 具体写法就是内层一个表示y轴的线段树,正常写即可,不过要标记永久化一下 外层一个线段树同理,把数组换成内层线段树即可 阅读全文
posted @ 2020-02-14 15:14 Mrzdtz220 阅读(128) 评论(0) 推荐(0)
摘要:线段树上每个节点开个vector,表示包含当前区间的熊孩子的编号 当一个区间的值变为 $0$ 时遍历这个vector,对熊孩子的权值减去当前区间原始权值和 当熊孩子的权值变为 $0$ 时答案加一 vector总共只有 $O(m \log n)$ 个元素,最多会被遍历一次 所以复杂度还是 $O(n\l 阅读全文
posted @ 2020-02-14 09:37 Mrzdtz220 阅读(124) 评论(0) 推荐(0)
摘要:平衡树中序遍历之后是个递增序列,那么 LCA 的 key 肯定加在两个节点的 key 之间 而 priority 是最小的,否则可以往上走 所以就是区间查询最值,动态开点即可 输入会有负数。。 常数较大。。 因为它的log是int大小的log。。 阅读全文
posted @ 2020-02-14 01:42 Mrzdtz220 阅读(108) 评论(0) 推荐(0)
摘要:在修改操作和查询操作那里搞了好久。 标记在修改过程是不需要下传也不需要pushup的 只需要在最后查询的时候多开一个参数表示从根到当前节点的最大值,每次取max即可,若当前没有左儿子,说明左儿子都是这个值,右儿子同理 阅读全文
posted @ 2020-02-13 21:01 Mrzdtz220 阅读(75) 评论(0) 推荐(0)
摘要:线段树直接维护区间最大值最小值,修改时直接对最大最小值进行修改 pushdown时将左右儿子的最大最小值卡进父亲的上下界 阅读全文
posted @ 2020-02-13 17:32 Mrzdtz220 阅读(116) 评论(0) 推荐(0)
摘要:考虑线段树维护区间最大斜率以及区间答案 合并答案时左边的答案不会受到影响,而右边就要统计答案左边斜率最大值 $k$ 的个数 递归进去求解,当区间最大斜率不大于这个 $k$,那么答案为 $0$ 直接返回,否则看左右儿子 若左儿子的最大斜率大于等于 $k$,那么当前 $ans[p] ans[lp]$ 就 阅读全文
posted @ 2020-02-13 15:43 Mrzdtz220 阅读(76) 评论(0) 推荐(0)
摘要:[传送门] 欧拉序可以 $O(1)$ 得到两点的 LCA 线段树维护区间直径,两个区间合并时,新的直径的端点肯定是这两个子区间直径的端点。 复杂度 $O(nlogn)$ #include <cstdio> #include <cstring> #include <cctype> #include < 阅读全文
posted @ 2019-10-21 21:51 Mrzdtz220 阅读(150) 评论(0) 推荐(0)
摘要:[传送门] 树链剖分。线段树维护区间最左边和最右边的颜色以及区间颜色段,合并时等于左区间颜色段+右区间颜色段-[左区间右端点颜色==右区间左端点颜色] #include <bits/stdc++.h> namespace IO { #define getc getchar void read() { 阅读全文
posted @ 2019-10-18 23:40 Mrzdtz220 阅读(105) 评论(0) 推荐(0)
摘要:转化一下询问即为区间$max - min + 1 = cnt$,其中$cnt$表示区间内数的种类数。 即求有多少区间$max - min - cnt=-1$,注意到任意区间的$max-min-cnt \geq -1$,那么即维护区间$max-min-cnt$的最小值和最小值的个数,再看最小值等不等于 阅读全文
posted @ 2019-10-14 19:08 Mrzdtz220 阅读(144) 评论(0) 推荐(0)
摘要:[传送门] 这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$r$。然后当前线段树/树状数组维护区间左端点为$[1,r)$时对应的答案,那么新加一个数对区间$[last[a[r] + 1, r]$多了$a[r]$的贡献。这道题也一 阅读全文
posted @ 2019-10-14 19:04 Mrzdtz220 阅读(251) 评论(0) 推荐(0)
摘要:[传送门] 比赛的时候想了半天的带修改主席树(其实之前只写过一次。),两个log甚至三个log都想了,自闭了五个小时还是不会实现。问了一下西瓜得到了一个非常妙的1 log解法。此处膜瓜🍉 一操作相当于把一个数删掉,因为$a_i + 10^7$肯定不会影响到$n + 1$,最坏情况下也能直接取$n 阅读全文
posted @ 2019-10-14 18:19 Mrzdtz220 阅读(110) 评论(0) 推荐(0)
摘要:[传送门] 将第二维离散化一下,按第一维从大到小,第二维从小到大,第三维从大到小排序,这样即使第一维相同的情况下也不会重,然后用一棵线段树维护第二维为$I_{i}$时第三维的最大值,插入每一个元素之前先查询$\left[I_{i} + 1, n\right]$的最大值,若查询得到的$x$大于$R_{ 阅读全文
posted @ 2019-10-14 14:27 Mrzdtz220 阅读(128) 评论(0) 推荐(0)
摘要:[传送门] 写的时候一直没有想到离线解法,反而想到两个比较有趣的解法。一是分块,$f[i][j]$表示第$i$块块首元素到第$j$个元素之间满足条件的最大值(即对$B_l + B_r \in K$的$A_l + A_r$的最大值)。这个可以$O(nm\sqrt n)$预处理,查询就$l$属于的块$p 阅读全文
posted @ 2019-10-13 01:47 Mrzdtz220 阅读(144) 评论(0) 推荐(0)
摘要:[传送门] 首先,树剖无疑。其次,不会了... 搜了发题解才知道咋写。 没有什么正(wo)常(hui)点(xie)的线段树直接做的写法。换个形式,发现题目中的修改可以用矩阵乘法来表示一个节点用一个$1 \times 3$的矩阵来表示$$\begin{bmatrix} 1 & v & t \end{b 阅读全文
posted @ 2019-10-13 01:42 Mrzdtz220 阅读(142) 评论(0) 推荐(0)