樱洛CHANGE @ 2021-09-07 16:09:14
我的代码:(动态开点权值线段树)
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
这是为什么,有没有大佬能解释一下
by KEBrantily @ 2021-09-07 19:46:11
@樱洛CHANGE 不晓得啊,我一直都是能用单个数组就不用结构体(
by 樱洛CHANGE @ 2021-09-07 20:48:54
@KnightL 我是结构体写习惯了,是真不习惯散装数组了。。。