小问题玄关求助!!!
查看原帖
小问题玄关求助!!!
1399216
_Gloaming_楼主2024/8/13 09:49

(下截题解第二篇)

Tree ask(int k,int x,int y)//询问函数,因为每次返回的maxleft等值不一定是左右儿子的数据,所以要返回一个结构体
{
    if(x<=tree[k].l&&tree[k].r<=y)
    {
        return tree[k];
    }
    int mid=(tree[k].l+tree[k].r)/2;
    if(y<=mid) return ask(k*2,x,y);//如果访问的区间全在左儿子里,直接return
    else
    {
        if(x>mid) return ask(k*2+1,x,y);//如果访问的区间全在右儿子里,也直接return
        else
        {//否则就左右儿子都访问,然后合并区间
            Tree t,a=ask(k*2,x,y),b=ask(k*2+1,x,y);
            t.maxleft=max(a.maxleft,a.sum+b.maxleft);//做类似的合并区间
            t.maxright=max(b.maxright,a.maxright+b.sum);
            t.ans=max(max(a.ans,b.ans),a.maxright+b.maxleft);
            return t;//返回合并后的区间
        }
    }
}

while(m--)
    {
        int choose,x,y;
        scanf("%d%d%d",&choose,&x,&y);
        if(choose==1)
        {
            if(x>y)swap(x,y);//这是个坑点,因为题目没有注明x<=y,就是因为这个我调了半天QAQ,最后还是看讨论才知道的,感谢讨论的巨佬们
            printf("%lld\n",ask(1,x,y).ans);
        }
        else
        {
            change(1,x,y);
        }
   
}

RT 为什么询问的时候能保证返回的区间完整呢?

2024/8/13 09:49
加载中...