警钟敲烂:9pts的一种原因

P4513 小白逛公园

f_hxr_ @ 2024-01-09 16:02:52

区间查询必须要打包成一个结构体,然后老老实实合并,就像这样:

node query(int p,int L,int R,int ql,int qr){
    if(ql<=L&&R<=qr)return dat[p];
    pushdown(dat[p]);int mid=(L+R)>>1;
    if(ql<=mid&&mid+1<=qr){
        node ret,LHQ=query(dat[p].ls,L,mid,ql,qr),RMJ=query(dat[p].rs,mid+1,R,ql,qr);
        ret.sum=LHQ.sum+RMJ.sum;
        ret.lmax=max(LHQ.lmax,LHQ.sum+RMJ.lmax);
        ret.rmax=max(RMJ.rmax,RMJ.sum+LHQ.rmax);
        ret.ans=max(max(LHQ.ans,RMJ.ans),LHQ.rmax+RMJ.lmax);
        return ret; 
    }
    if(ql<=mid)return query(dat[p].ls,L,mid,ql,qr);
    if(mid+1<=qr)return query(dat[p].rs,mid+1,R,ql,qr);
}

不要像这样偷懒:直接套个rmax[ls[p]]+lmax[rs[p]]没错我因此重构了整个代码调了1h

int QueryRange(int p,int L,int R,int ql,int qr){
    if(ql<=L&&R<=qr)return ans[p];
    pushdown(p);int mid=(L+R)>>1;
    if(ql<=mid&&mid+1<=qr)
        return max(max(QueryRange(ls[p],L,mid,ql,qr),
                       QueryRange(rs[p],mid+1,R,ql,qr)),
                       rmax[ls[p]]+lmax[rs[p]]);
    if(ql<=mid)return QueryRange(ls[p],L,mid,ql,qr);
    if(mid+1<=qr)return QueryRange(rs[p],mid+1,R,ql,qr);
}

|