Segment tree
segment tree维护某个范围内的某个值,这个值要能随着两个范围的合并快速合并。segtree要支持范围修改,即快速对范围内的每个值做某个操作,或者查询范围内的值,一个segtree包含一个tree数组,一个update数组,用来标记是否有懒更新(有时候change数组里val为0不一定是没有懒更新),一个change数组记录懒更新的值
基本模板,如果range长度为n,则tree arr长度为4(n+1)比较好,idx是对应范围[left, right]的idx,由于segtree是存在一个完全二叉树array里的,最大的范围idx是1,左半边idx是2*idx,右半边idx是2*idx+1;
query(jobl, jobr, left, right)的含义是查询left和right在jobl和jobr范围内被覆盖到部分的值
懒更新,对一个范围修改时不去修改segtree里子范围里的值,而是只对当前范围做修改,然后把修改值缓存在change数组里有必要时再下发
lazyupdate会update当前idx的val,并记录需要下发的val信息。它被用在两个地方,第一是直接的update指令发到了某个被覆盖的范围上,第二是当前层有懒信息需要下发时会把消息懒到下一层去
down是懒信息的下发,并会清空当前层的懒信息
Last updated