关于内存问题
查看原帖
关于内存问题
105833
樱洛CHANGE楼主2021/9/7 16:09

我的代码:(动态开点权值线段树)

const int N=1e6+5,M=1e9+5;
int n,m,a[N];
class SegmentTree{
	private:
		int cnt;
		class Node{
			public:
				int ls,rs,val;
				ll sum;
				Node():ls(0),rs(0),val(0),sum(0){}
		}t[N*5];
		#define mid (l+((r-l)>>1))
		inline void Pushup(rint p){
			t[p].val=t[t[p].ls].val+t[t[p].rs].val;
			t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum;
		}
	public:
		int root;
		SegmentTree():cnt(0),root(0){}
		inline void Change(rint &p,rint l,rint r,rint pos,rint k){
			if(l>pos||r<pos) return ;
			if(!p) p=++cnt;
			if(l==r) return t[p].val+=k,t[p].sum+=(ll)pos*k,void();
			Change(t[p].ls,l,mid,pos,k),Change(t[p].rs,mid+1,r,pos,k),Pushup(p);
		}
		inline int Asknum(rint p,rint l,rint r,rint x,rint y){
			if(l>y||r<x||!p) return 0;
			if(l>=x&&r<=y) return t[p].val;
			return Asknum(t[p].ls,l,mid,x,y)+Asknum(t[p].rs,mid+1,r,x,y);
		}
		inline ll Asksum(rint p,rint l,rint r,rint x,rint y){
			if(l>y||r<x||!p) return 0ll;
			if(l>=x&&r<=y) return t[p].sum;
			return Asksum(t[p].ls,l,mid,x,y)+Asksum(t[p].rs,mid+1,r,x,y);
		}
}t;

内存占用极其之大,卡了内存才过的。

同学的代码:(也是动态开点权值线段树)

#define int long long
#define mid ((l+r)>>1)
using namespace std;
int n,m,s[10000001];
int L[10000001],R[10000001],siz[10000001],val[10000001],tot=1,rt=1;
void push_up(int x)
{
	siz[x]=siz[L[x]]+siz[R[x]];
	val[x]=val[L[x]]+val[R[x]];
}
void add(int &x,int l,int r,int to,int v)
{
	if(r<to||l>to)return ;
	if(x==0)x=++tot;
	if(l==r)
	{
		siz[x]+=v;
		val[x]+=l*v;
		return ;
	}
	add(L[x],l,mid,to,v);
	add(R[x],mid+1,r,to,v);
	push_up(x);
}
int query(int x,int l,int r,int v)
{
	if(r<=v)return 0;
	if(l>v)return siz[x];
	if(!x)return 0;
	return query(L[x],l,mid,v)+query(R[x],mid+1,r,v);
}
int query_(int x,int l,int r,int v)
{
	if(r<=v)return val[x];
	if(l>v)return 0;
	if(!x)return 0;
	return query_(L[x],l,mid,v)+query_(R[x],mid+1,r,v);
}

内存占用极小,甚至define int long long

这是为什么,有没有大佬能解释一下

2021/9/7 16:09
加载中...