基础线段树板子

变量声明

//结构体
struct segment_tree
{
    
    
	ll l, r,sum,lz;
}t[N<<2];//开大约四倍;

int a[N];//点信息;

上升和下沉

void pushup(i){
    
    ...};
void pushdown(i){
    
    ...};

建树

// 建树
void build(int i,int l,int r)
{
    
    
	t[i].l = l,t[i].r = r;
	if(l == r){
    
    
		t[i].sum = a[l];
		return ;
	}
	int mid = (l+r) >> 1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(i);	
}

修改

// 区间修改;
void update(int i,l,r,k)// k 变量;
{
    
    
	if(t[i].l >= l && t[i].r <= r){
    
    
		t[i].sum += k*(t[i].r - t[i].l+1);
		t[i].lz += k;
		return ;
	}
	pushdown(i);
	if(t[lc].r >= l) update(lc,l,r,k);
	if(t[rc].l <= r) update(rc,l,r,k);
	pushup(i);
}

查询

ll query(int i,int l, int r)
{
    
    
	if(t[i].l >= l && t[i].r <= r){
    
    
		return t[i].sum;
	}
	if(t[i].r <l || t[i].l > r ) return 0;
	pushdown(i);
	ll s = 0;
	if(t[lc].r >= l) s += query(lc,l,r);
	if(t[rc].l <= r) s+= query(rc,l,r);
	return s;
}

参考链接

猜你喜欢

转载自blog.csdn.net/qq_51687628/article/details/118753399