线段树练习笔记
普通线段树
CF61E Enemy is weak
记录 \(dp_i\) 表示满足 \((j < i)\) 的 \((i,j)\) 的双元组。
建立两颗线段树,第一颗是关于 \(a_i\) 的, 第二颗是关于 \(dp_i\)的,最后算到每一位的时候讲答案加上第二颗线段树对于 \(a_i\) 的查询就好了
CF338E Optimize!
对 \(A\) 一个条件相当于限制 \(h - B_j \ge A_i\) 的数的数量大于 \(m - i + 1\)。首先给每一个 \(A\) 的数加上 \(m - i + 1\), 然后双指针扫一下即可。
AT1984 [AGC001F] Wide Swap
考虑做他的逆置换,就相当于让相邻的两个数,如果差 \(\ge K\), 才可以交换这两个数。因此如果两个数的差 \(< K\), 他们出现的顺序就不能交换,把他们连一条边。
于是可以考虑做个拓扑排序。但是会超时。于是我们对于位置 \(x\),让最靠后的 \(t1, t2\) 满足 \(a_t1 < a_x, t1 < x, a_t2 ? a_x, t2 > x\) 和他连边。
容易证明这样是对的。
CF1117G Recursive Queries
一个数分为对左边和对右边的贡献,把操作离线下来线段树搞就好了
李超线段树
P4254 [JSOI2008]Blue Mary开公司
模板题 * 2
P4069 [SDOI2016]游戏
把李超树搬到了树上,事实上还是很简单的。这里还要维护一个 \(minn\) 值。
P4655 [CEOI2017]Building Bridges
推推 \(dp\) 式,会发现和线段有些关系,李超树维护 \(dp\) 即可。
CF932F Escape Through Leaf
发现这个 \(dp\) 式和查询一堆线段在一个位置的 \(max\) 有关系,可以用李超线段树来维护线段。然后上李超线段树合并即可。
主席树
CF840D Destiny
考虑如果维护出了 \([l, r]\) 的权值线段树,怎么做?
直接在线段树上,如果遇到出现次数 \(\le \frac{r - l + 1}{k}\) 的就不继续递归。单次时间复杂度是 \(\Theta(\frac{len \log len}{\frac{len}{k}}) = \Theta(k \log len)\)
维护权值线段树只要弄颗主席树就好了。