-
思路
-
模板
接着1.1的单点修改区间查询,图解和分析见1.1
如果对于一个区间的修改,要查找单个的值
可能对不同线段长添加x的值,而如果多次添加在一个线段,那么就对相应长度进行改变
那么需要每次修改都传递给最小的点吗
例如当2~4增加1,我要查询3,第二次又是2~4增加2,那么完全可以合并操作,先不传递,查询时依次查看,按照树的结构,从根到节点,直到节点。单次复杂度 修改=1;查询=logn
建树操作和1.1一样
给position加x
void modify(int position, int l, int r, int x)
{
if(tree[position].l >= l && tree[position].r <= r) {
tree[position].num += x;
return ;//全在区间内
}
int mid = tree[position].l + tree[position].r >> 1;
if(l <= mid) modify(position << 1, l, r, x);
if(r > mid) modify(position << 1 | 1, l, r, x);
}
类比1.1的修改思路,不在区间就找零
void search(int i,int dis){
ans+=tree[i].sum;//加起来
if(tree[i].l==tree[i].r)
return ;
if(dis<=tree[i*2].r)
search(i*2,dis);
if(dis>=tree[i*2+1].l)
search(i*2+1,dis);
}
初始值从小到大加上每个线段的修改值