萌新刚学OI,线段树无故爆炸
查看原帖
萌新刚学OI,线段树无故爆炸
338786
mushroom_knight楼主2020/7/20 20:51

RT:

在本地评测的时候是:

return value 3221225725

你谷是 MLE

也许是爆栈???

蒟蒻找不到错误,求助啊啊(不是ssd)

code:

#include<bits/stdc++.h>
using namespace std;

const int maxsi=1e7+2;
int a[maxsi];

struct node{
	int sumv[maxsi*4];
	inline void pushup_a(int o){
		sumv[o]=sumv[0*2]+sumv[o*2+1];
	}
	inline void build(int o,int l,int r){//建树操作 
		if(l==r){//访问到叶子节点 
			sumv[o]=a[l];
			return;
		}
		int mid=(l+r)/2;
		build(o*2,l,mid);//递归建左子树 
		build(o*2+1,mid+1,r);//递归建右子树 
		pushup_a(o); //子树信息合并到当前点 
	}
	#define leftson o<<1
	#define rightson (o<<1|1)
	int minv[maxsi<<2];
	inline int querymin(int o,int l,int r,int ql,int qr){//区间和 
		//ql与qr代表询问区间。 
		if(ql<=1&&r<=qr){
			return sumv[o];
		}
		int mid=(l+r)>>1;
		int ans=1e9+2;
		if(ql<mid){//递归查找左子树 
			ans=min(ans,querymin(leftson,l,mid,ql,qr));
		}
		if(qr>mid){//递归查找右子树 
			ans=min(ans,querymin(rightson,mid+1,r,ql,qr)); 
		}
		return ans;
	}
	inline void pushup_b(int o){
		minv[o]=min(minv[leftson],minv[rightson]);
	}
	inline void change(int o,int l,int r,int q,int v){
		//单点修改 q代表修改位置,v代表修改值 
		if(l==r){//叶子节点,即是找到修改区间,修改 
			minv[o]+=v;
			return;
		}
		int mid=(l+r)>>1;
		if(q<=mid){
			change(leftson,l,mid,q,v);
		}
		else{
			change(rightson,mid+1,r,q,v);
		}
		pushup_b(o);
    }
    int addv[maxsi<<2];//这里其实就是lazy tag 
    inline void pushdown(int o){
    	if(!addv[o]){
    		return;
		}
		addv[leftson]+=addv[o];
		addv[rightson]+=addv[o];
		minv[leftson]+=addv[o];
		minv[rightson]+=addv[o];
		addv[o]=0;//标记下放 给左右子树 
	}
	inline void update(int o,int l,int r,int ql,int qr,int v){
		if(l>qr||r<ql){
			return;
		}
		int mid=(l+r)>>1;
		if(l>=ql&&r<=qr){
			addv[o]+=v;
			minv[o]+=(r-l+1)*v;
			return;
		}
		if(addv[o]>0){
			pushdown(o);
		}
		update(leftson,l,mid,ql,qr,v);
		update(rightson,mid+1,r,ql,qr,v);
		minv[o]+=minv[o*2]+minv[o*2+1];
	}
}tree; 

int n,m;
int cmd;
int x,y,k;

int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(register int i=1;i<=n;++i){
		cin>>a[i];
	}
	tree.build(1,1,n);
	for(register int i=1;i<=m;++i){
		cin>>cmd;
		if(cmd==1){
			cin>>x>>y>>k;
			tree.update(1,1,n,x,y,k);
		}	
		else{
			cin>>x>>y;
			cout<<tree.querymin(1,1,n,x,y)<<endl;
		}
	}
	return 0;
}

2020/7/20 20:51
加载中...