C 对两种以上类型的查询使用延迟传播

C 对两种以上类型的查询使用延迟传播,c,algorithm,segment-tree,lazy-propagation,C,Algorithm,Segment Tree,Lazy Propagation,我有一个问题,有很多疑问,有四种类型: 添加到范围 初始化一个范围 将范围与标量相乘 查找某个范围内的运行总和 由于查询数量巨大,我不得不使用带有延迟传播的段树,但我一直在研究如何在两种以上的查询类型上使用延迟传播。 我如何才能确定以后进行更新时,将进行何种类型的更新(即加法、乘法、初始化)?1.2.3。这是简单的初始化和更新部分 struct info { int prop,sum; } tree[mx*3]; void update(int node,int b,int e,int

我有一个问题,有很多疑问,有四种类型:

  • 添加到范围

  • 初始化一个范围

  • 将范围与标量相乘

  • 查找某个范围内的运行总和

  • 由于查询数量巨大,我不得不使用带有延迟传播的段树,但我一直在研究如何在两种以上的查询类型上使用延迟传播。
    我如何才能确定以后进行更新时,将进行何种类型的更新(即加法、乘法、初始化)?

    1.2.3。这是简单的初始化和更新部分

    struct info
    {
        int prop,sum;
    } tree[mx*3];
    
    void update(int node,int b,int e,int i,int j,int x)
    {
        if (i > e || j < b) return;
        if (b >= i && e <= j)
        {
            tree[node].sum+=((e-b+1)*x);
            tree[node].prop+=x;
            return;
        }
        int Left=node*2;
        int Right=(node*2)+1;
        int mid=(b+e)/2;
        update(Left,b,mid,i,j,x);
        update(Right,mid+1,e,i,j,x);
        tree[node].sum=tree[Left].sum+tree[Right].sum+(e-b+1)*tree[node].prop;
    
    }
    
    这里,tree是段树。每个节点将包含两个节点 信息。一个是您之前添加的数字。支柱遗嘱 存储历史记录。sum是该节点的总值

    **在您的评论之后:

    //Initialization:
    
    void init(int node,int b,int e)
    {
        if(b==e)
        {
            tree[node]=arr[b];
            return;
        }
        int Left=node*2;
        int Right=node*2+1;
        int mid=(b+e)/2;
        init(Left,b,mid);
        init(Right,mid+1,e);
        tree[node]=tree[Left]+tree[Right];
    }
    

    1.2.3。这是简单的初始化和更新部分

    struct info
    {
        int prop,sum;
    } tree[mx*3];
    
    void update(int node,int b,int e,int i,int j,int x)
    {
        if (i > e || j < b) return;
        if (b >= i && e <= j)
        {
            tree[node].sum+=((e-b+1)*x);
            tree[node].prop+=x;
            return;
        }
        int Left=node*2;
        int Right=(node*2)+1;
        int mid=(b+e)/2;
        update(Left,b,mid,i,j,x);
        update(Right,mid+1,e,i,j,x);
        tree[node].sum=tree[Left].sum+tree[Right].sum+(e-b+1)*tree[node].prop;
    
    }
    
    这里,tree是段树。每个节点将包含两个节点 信息。一个是您之前添加的数字。支柱遗嘱 存储历史记录。sum是该节点的总值

    **在您的评论之后:

    //Initialization:
    
    void init(int node,int b,int e)
    {
        if(b==e)
        {
            tree[node]=arr[b];
            return;
        }
        int Left=node*2;
        int Right=node*2+1;
        int mid=(b+e)/2;
        init(Left,b,mid);
        init(Right,mid+1,e);
        tree[node]=tree[Left]+tree[Right];
    }
    

    您可以给Update函数另一个参数,称之为Query。根据该参数的值,将执行相应的操作

    对于加法和乘法,延迟传播的信息可以包含在两个字段中:

    设A为叶的初始值,存在任意系列的乘法和加法,例如:+u+v*w+x*y+z。 将这些操作应用于lazy1。所以它的值是:((u+v)*w+x)*y+z。lazy2应该只包含乘法,这将是w*y

    要更新节点,请先乘以lazy2,然后再加上lazy1

    原因:
    将这些运算应用于初始值A,得到:A*w*y+((u+v)*w+x)*y+z。只有乘法直接影响初始值A,这一点很简单。因此,这些可以存储在一个字段中,而另一个字段可以包含加法,并且必须对其应用乘法,因为顺序在这里很重要。

    您可以给Update函数另一个参数,称之为Query。根据该参数的值,将执行相应的操作

    对于加法和乘法,延迟传播的信息可以包含在两个字段中:

    设A为叶的初始值,存在任意系列的乘法和加法,例如:+u+v*w+x*y+z。 将这些操作应用于lazy1。所以它的值是:((u+v)*w+x)*y+z。lazy2应该只包含乘法,这将是w*y

    要更新节点,请先乘以lazy2,然后再加上lazy1

    原因:

    将这些运算应用于初始值A,得到:A*w*y+((u+v)*w+x)*y+z。只有乘法直接影响初始值A,这一点很简单。因此,这些数据可以存储在一个字段中,而另一个字段可以包含加法,并且必须对其应用乘法,因为这里的顺序很重要。

    我认为您需要更多地解释您正在做的事情(虽然我知道这似乎理解了您的意图,但我也不确定是否遵循了他的答案)。你的“大数字”有多大?10、100、1000或更多?查询的格式如何?运行总和是什么数据?值是整数还是浮点数(或其他值)?重温这个问题,我仍然不确定
    范围是什么:[上、下]或两个边界之间的整数集?@greybeard range是两个边界内数组的元素,其中边界由上、下索引定义。涉及到数组吗?你不会这么说。这不是到目前为止的问题。主持人注意:关于正在进行的竞赛的问题并不是堆栈溢出的主题。版主可以也不会监督第三方协议,其中包括竞赛规则。这取决于竞赛对其规则的约束或监督。请不要仅仅因为这是一个CodeChef竞赛就标记此帖子。我认为你需要更多地解释你在做什么(虽然我知道这似乎理解了你的意图——但我也不确定我是否遵循了他的答案)。你的“大数字”——10、100、1000或更多——有多大?查询的格式如何?运行的总和是什么数据?值是整数还是浮点数(或其他)?重温这个问题,我仍然不确定
    范围是什么:[下,上)或者两个边界之间的整数集?@greybeard range是两个边界内的数组元素,其中边界由上下索引定义。这涉及到一个数组?你不会这么说。这不是到目前为止的问题。主持人注意:关于正在进行的竞赛的问题不是堆栈溢出的主题。主持人可以并且不会监督第三方协议,这包括竞赛规则。这取决于竞赛纪律或监督他们的规则。请不要仅仅因为这是一个CodeChef竞赛就标记此帖子。如何同时进行乘法和初始化更新。我可以一次使用2个,但对于所有4个,我不会得到co更正结果。您可以通过更新函数初始化。然后您只需更改一个事项。第一个\u范围和最后一个\u范围将相同。不,这不是必需的。您可以使用相同的更新函数。这里的prop用于add。现在,当我需要处理乘法顺序事项时,那么如何使用相同的函数处理它。您可以添加不同的prop对于求和和和乘法。像prop_add和prop_mul。我想。如何同时对乘法和初始化进行更新。我可以一次使用2个,但对于所有4个,我没有得到正确的结果。你可以通过更新函数进行初始化。然后你必须