求各路大神指点语法,CE了
  • 板块学术版
  • 楼主UKE_Piu
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/5 23:20
  • 上次更新2024/8/6 09:24:57
查看原帖
求各路大神指点语法,CE了
787031
UKE_Piu楼主2024/8/5 23:20

蒟蒻写的线段树板子(这个)

不知道这一份代码CE的原因是什么,求大佬指出和提出修改意见!

期望在封装的基础上修改。

devc++报错是:

invalid use of non-static data member

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int n,m;
const int N=5e5+5;
int a[N];

struct SegTree{
	struct Modify{
		int add;
		Modify operator +(const Modify &b){
			return Modify{add+b.add};
		}
	} ;
	static Modify Zero_Modify;
	struct node{
		int w,sz; Modify tag;
		node operator +(const node &b){
			return node{w+b.w,sz+b.sz,Zero_Modify};
		}
		node operator +(const Modify &c){
			return node{w+c.add*sz,sz,tag+c};
		}
	};
	
	node tr[N<<2]; static node Empty_node; 
	
	inline int ls(int u){ return u<<1; }
	inline int rs(int u){ return u<<1|1; }
	inline bool IN(int l,int r,int x,int y){ return x<=l&&r<=y; }
	inline bool OUT(int l,int r,int x,int y){ return r<x||y<l;	}
	inline void Init(int Empty_weigh,int Empty_size,int Zero_Modify_Target){ 
		Zero_Modify=Modify{ Zero_Modify_Target };
		Empty_node=node{ Empty_weigh,Empty_size,Zero_Modify };
	}
	
	void pushup(int u){ tr[u]=tr[ls(u)]+tr[rs(u)]; }
	void maketag(int u,Modify k){
		tr[u]=tr[u]+k;
	}
	void pushdown(int u){
		maketag(ls(u),tr[u].tag); maketag(rs(u),tr[u].tag);
		tr[u].tag=Zero_Modify;
	}
	
	void Build(int u,int l,int r){
		if(l==r){ tr[u]=node{a[l],1,Zero_Modify}; return ; }
		int mid=(l+r>>1);
		Build(ls(u),l,mid); Build(rs(u),mid+1,r);
		pushup(u);
	}
	void Update(int u,int l,int r,int x,int y,Modify k){
		if(IN(l,r,x,y)) { maketag(u,k); return ;	}
		else if(OUT(l,r,x,y)) return ;
		else {
			pushdown(u);
			int mid=(l+r>>1);
			Update(ls(u),l,mid,x,y,k); Update(rs(u),mid+1,r,x,y,k);
			pushup(u);
		}
	}
	node Query(int u,int l,int r,int x,int y){
		if(IN(l,r,x,y)) { return tr[u];	}
		else if(OUT(l,r,x,y)){ return Empty_node;	}
		else{
			pushdown(u);
			int mid=(l+r>>1);
			node ret=Empty_node;
			ret=ret+Query(ls(u),l,mid,x,y); ret=ret+Query(rs(u),mid+1,r,x,y);
			return ret;
		}
	}
};
SegTree T;

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	T.Init(0,0,0);
	T.Build(1,1,n);
	while(m--){
		int opt; cin>>opt;
		int l,r,k; cin>>l>>r;
		if(opt==1){
			cin>>k;
			T.Update(1,1,n,l,r,SegTree::Modify{k});
		}
		else {
			SegTree::node ret=T.Query(1,1,n,l,r);
			cout<<ret.w<<'\n';
		}
	}
	return 0;
}
2024/8/5 23:20
加载中...