Extention
D-数据结构
D1-序列结构
树状数组
lowbit(x):x&(-x) 得到 最低位的 1 以及若干后缀 0。
管辖范围:。
建树 :做前缀和,。
时间优化:
可动态维护前缀和。
区间修改单点查询:差分。
查询第 k 小数:权值树状数组存储每个值的出现次数。
int kth(int k){
int ans=0,ct=0;
for(int i=tot;i>=0;i--){
ans+=(1<<i);
if(ans>N||ct+c[ans]>=k) ans-=(1<<i);
else ct+=c[ans];
}
return ++ans;
}
线段树
动态开点线段树 & 线段树合并 & 线段树分裂
-
动态开点线段树可以使用懒标记,下传标记时需要新建结点(若标记对空节点无影响则不必新建节点)。
-
遇到仅针对某个权值的修改和询问时,可以考虑对每个权值开一个动态开点线段树。
-
线段树合并单次复杂度,取决于两棵线段树的交集大小;线段树合并总复杂度,取决于所有线段树的节点总数。
-
线段树合并支持持久化,需要在合并时新建节点。
-
在线段树合并的过程中,可以统计来自不同线段树且具有相对顺序关系的信息。例如逆序对。
-
在线段树合并的过程中,在处理复杂的问题时,可以尝试分成以下几类讨论(其中 2, 3 是讨论重点):
-
(1)p,q 均为空节点:返回空节点。
-
(2)p,q 中分别有一个空节点和一个非空节点:特殊讨论。
-
(3)线段树递归到叶子节点(即 l=r):特殊讨论。
-
(4)p,q 均为非空节点:分别合并 p,q 的左儿子与 p,q 的右儿子,最后 update。
-
-
线段树分裂单次复杂度 O(logA),新建节点个数 O(logA)。
namespace SGT{
