萌新刚学OI,求问这个线段树哪里锅了
  • 板块学术版
  • 楼主引领天下魔酸
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/10/22 20:51
  • 上次更新2023/11/5 10:09:04
查看原帖
萌新刚学OI,求问这个线段树哪里锅了
39863
引领天下魔酸楼主2020/10/22 20:51

一个维护区间最小值,支持区间修改操作的线段树

class Segment_Tree{
	public:
		int a[60005];
	private:
		int ans[240005],tag[240005];
		inline int lson(int p){return p<<1;}
		inline int rson(int p){return p<<1|1;}
		inline void push_up(int p){ans[p]=min(ans[lson(p)],ans[rson(p)]);}
		inline void push_down(int p){
			tag[lson(p)]+=tag[p];
			tag[rson(p)]+=tag[p];
			ans[lson(p)]+=tag[p];
			ans[rson(p)]+=tag[p];
			tag[p]=0;
		}
	public:
		inline void build(int p,int l,int r){
			if(l==r){ans[p]=a[l];return;}
			int mid=l+r>>1;
			build(lson(p),l,mid);
			build(rson(p),mid+1,r);
			push_up(p);
		}
		inline void add(int p,int l,int r,int nl,int nr,int k){
			if(nl<=l&&nr>=r){ans[p]+=k;tag[p]+=k;return;}
			if(nl>r||nr<l)return;
			push_down(p);
			int mid=l+r>>1;
			add(lson(p),l,mid,nl,nr,k);
			add(rson(p),mid+1,r,nl,nr,k);
			push_up(p);
		}
		inline int ask(int p,int l,int r,int nl,int nr){
			if(nl<=l&&nr>=r)return ans[p];
			if(nl>r||nr<l)return 1<<30;
			push_down(p);
			int mid=l+r>>1,res=1<<30;
			res=min(res,ask(lson(p),l,mid,nl,nr));
			res=min(res,ask(rson(p),mid+1,r,nl,nr));
			return mid;
		}
}tree;
2020/10/22 20:51
加载中...