关于内存问题

P3586 [POI2015] LOG

樱洛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 我是结构体写习惯了,是真不习惯散装数组了。。。


上一页 |