求线段树板子
  • 板块学术版
  • 楼主zbl2012
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/5 17:39
  • 上次更新2025/8/5 18:47:29
查看原帖
求线段树板子
1653348
zbl2012楼主2025/8/5 17:39

rt。要求包含区间加,区间改,区间和,区间最大的结构体线段树板子,或者帮我改一下。

template<typename T>
struct segmentTree{
	int n;
	vector<T>tree,lazy,cover;
	segmentTree(int n){this->n=n;tree.resize(4*n);lazy.resize(4*n,0);cover.resize(4*n,-1);}
	segmentTree(T arr[],int size):n(size){
		tree.resize(4*n);lazy.resize(4*n,0);cover.resize(4*n,-1);build(arr,1,0,n-1);
	}
	void build(vector<T>&arr,int node,int start,int end){
		lazy[node]=0;cover[node]=-1;
		if(start==end){tree[node]=arr[start];return;}
		int mid=(start+end)/2;
		build(arr,2*node,start,mid);
		build(arr,2*node+1,mid+1,end);
		tree[node]=tree[2*node]+tree[2*node+1];    
	}
	void build(T arr[],int node,int start,int end){
		lazy[node]=0;cover[node]=-1;
		if(start==end){tree[node]=arr[start];return;}
		int mid=(start+end)/2;
		build(arr,2*node,start,mid);
		build(arr,2*node+1,mid+1,end);
		tree[node]=tree[2*node]+tree[2*node+1];
	}
	void pushdown(int node,int start,int end){
		int mid=(start+end)/2;
		if(cover[node]!=-1){
			tree[2*node]=cover[node]*(mid-start+1);
			tree[2*node+1]=cover[node]*(end-mid);
			cover[2*node]=cover[2*node+1]=cover[node];
			lazy[2*node]=lazy[2*node+1]=0;
			cover[node]=-1;
		}
		if(lazy[node]!=0){
			tree[2*node]+=lazy[node]*(mid-start+1);
			tree[2*node+1]+=lazy[node]*(end-mid);
			lazy[2*node]+=lazy[node];
			lazy[2*node+1]+=lazy[node];
			lazy[node]=0;
		}
	}
	void update(int node,int start,int end,int l,int r,T val){
		if(start>r||end<l)return;
		if(start>=l&&end<=r){
			tree[node]=val*(end-start+1);
			cover[node]=val;
			lazy[node]=0;
			return;
		}
		pushdown(node,start,end);
		int mid=(start+end)/2;
		update(2*node,start,mid,l,r,val);
		update(2*node+1,mid+1,end,l,r,val);
		tree[node]=tree[2*node]+tree[2*node+1];
	}
	void update(int l,int r,T val){update(1,0,n-1,l,r,val);}
	void add(int node,int start,int end,int l,int r,T val){
		if(start>r||end<l)return;
		if(start>=l&&end<=r){tree[node]+=(end-start+1)*val;lazy[node]+=val;return;}
		pushdown(node,start,end);
		int mid=(start+end)/2;
		add(2*node,start,mid,l,r,val);
		add(2*node+1,mid+1,end,l,r,val);
		tree[node]=tree[2*node]+tree[2*node+1];
	}
	void add(int l,int r,T val){add(1,0,n-1,l,r,val);}
	T ask(int node,int start,int end,int l,int r){
		if(start>r||end<l)return 0;
		if(start>=l&&end<=r)return tree[node];
		pushdown(node,start,end);
		int mid=(start+end)/2;
		T left=ask(2*node,start,mid,l,r);
		T right=ask(2*node+1,mid+1,end,l,r);
		return left+right;
	}
	T ask(int l,int r){return ask(1,0,n-1,l,r);}
	T askmax(int node,int start,int end,int l,int r){
		if(start>r||end<l)return 0;
		if(start>=l&&end<=r)return tree[node];
		pushdown(node,start,end);
		int mid=(start+end)/2;
		T left=ask(2*node,start,mid,l,r);
		T right=ask(2*node+1,mid+1,end,l,r);
		return max(left,right);
	}
	T askmax(int l,int r){return askmax(1,0,n-1,l,r);}
};
2025/8/5 17:39
加载中...