国庆清北 数据结构
数据结构:
树状数组,堆
节点和左右儿子合并的线段树
树状数组:
快速求前缀和,单点修改
删东西,加东西,查询最小值,最大值
lowbit(4)=4
每个位置存一段区间的和
二维树状数组???n*m的空间
线段树,动态开节点序列
核心:区间可合并性
借教室:区间减法,求区间最小值
线段树一定可以1e5 ,维护少,域小可以过1e6
最大子段和:支持区间赋值,常数时间内得到更新完的信息
楼房重建:从头维护严格上升子序列,且支持可合并性
一个区间起码维护从头开始子序列...
左 右 右边怎么接起来?
并查集路径压缩后不能撤销(时间分治)
启发式合并:sz[x],sz[y]比较
按秩合并:rk[x],rk[y]
rk[x]>rk[y] x->y
rk[x]==rk[y] 随机合并 rk[y]++
秩是集合的复杂程度
序列染色:线段树:全部a[i]=i,染黑a[i]=0求[1,i]最大值
wbtree:白色,LCA代表元,dep最小的
黑色,最后形态,倒过来,不断染白
每条边第一次被染黑的时间:
平衡树:实现线段树所有,支持修改序列(切,翻转...)
set有序序列,有增加和删除???
map很大数组开不下???
dfs序:子树对应一个区间
进栈写一遍出栈写一遍,每个数出现两次,区间中子树
子树操作转化区间操作
非传统方法
1.点事件
扫描线一起,
2.分块 1.处理块与块,2.处理块内
3.cdq分治
数链剖分:重边,轻边
O(logn)轻边,每走到一条轻边,子树大小乘二+
COT 区间修改->单点修改 差分
重边差分,gcd不会改变,
更相减损术
差分数组上建线段树,
数链剖分
软件包管理器:
子树仍然对应一个区间,链logn,子树n
维护区间黑白数目
非传统方法:
矩形统计:扫描线 点事件 线段树 一般一起用(x1,y1) (a,l,r)
x1<x2<a1<x3<a2<a3......
y1加入线段树->单点修改
l,r 区间求和
天天爱跑步:所有人动,观察员时刻不同
1.s=0
2.s=d[u]-d[l]
s+d[u]-d[k]=t[k]
s+d[u]=t[k]+d[k] 路径的值,点的值
一个点,多少路径经过且权值相等
经过:u在k子树中,k在l子树中
l在k到根的路径上