警示后人

P2572 [SCOI2010] 序列操作

bianshiyang @ 2023-12-10 17:42:12

如果你查询时也是使用结构体,请注意下面这种写法:

node query1(int k,int l,int r,int a,int b)
{
    node res1,res2;
    if(a<=l&&b>=r)
    {
        return t[k];
    }
    down(k,l,r);
    int mid=(l+r)>>1;
    if(a<=mid) res1=query1(k<<1,l,mid,a,b);
    if(b>mid) res2=query1((k<<1)|1,mid+1,r,a,b);
    return work(res1,res2);
}

这样子写是错误的,因为 res1res2 会一直累计所访问的结果,就会使答案很大,应该改成下面的:

node query1(int k,int l,int r,int a,int b)
{
    if(a>r||b<l) return {};
    if(a<=l&&b>=r)
    {
        return t[k];
    }
    down(k,l,r);
    int mid=(l+r)>>1;
    return work(query1(k<<1,l,mid,a,b),query1((k<<1)|1,mid+1,r,a,b));
}

另外弱弱的问一句:这题真的是蓝吗,调崩了,感觉可以评紫


|