关于内存问题

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 HerikoDeltana @ 2021-09-07 16:11:22

洛谷上的内存是实际使用罢(?)


by 樱洛CHANGE @ 2021-09-07 16:13:15

@HerikoDeltana 那我也没用那么多啊。。。动态开点啊qwq


by 樱洛CHANGE @ 2021-09-07 16:13:55

@HerikoDeltana u1s1下面的代码是神brAKzero的,您可以看看我提交记录那个内存占用就离谱


by 樱洛CHANGE @ 2021-09-07 16:17:06

@HerikoDeltana /kel/kk/kk


by KEBrantily @ 2021-09-07 16:45:09

只能说是因为神 brAKzero 太强了。


by 樱洛CHANGE @ 2021-09-07 16:47:44

@KnightL 不是啊,题解有一个写权值线段树的,跟我写的基本一模一样,就是没封装,也内存贼小,我把封装删了,内存还是巨大。。。


by KEBrantily @ 2021-09-07 16:56:13

@樱洛CHANGE 我写的用了 19mb(


by logfk @ 2021-09-07 16:57:26

巧了我也 define int long long (


by logfk @ 2021-09-07 16:58:06

哦我写的树状数组啊那没事了(


by 樱洛CHANGE @ 2021-09-07 17:11:09

@KnightL /kel,所以到底为什么啊/kk


| 下一页