这是比赛的结果!
我假设M个类型为[L,R],(1现在这些时间间隔不能作为一个整体(我们可以分割它们!)
拆分后,我必须报告可能的最小值,即如果i(1我在干什么我试图创建一个段树(修改了一点)!我在用懒散的传播!注意每一段对我来说都是浪费,除了一段的长度为什么?只是因为我需要每个点的最小值,而不是一个段所以我更新每个间隔,然后根据它构建我的解决方案
我想它工作不正常(它给出了错误的答案!)
我只想知道我是不是完全错了(所以我可以戒掉它!)或者不!
我的更新功能:

void Update(int L,int R,int qe ,int qr,int e,int idx)
{
    if(Tree[idx].lazy!=INT_MAX)
    {
        Tree[idx].value=min(Tree[idx].value,Tree[idx].lazy);
        if(L!=R)
        {
            Tree[rc(idx)].lazy=min(Tree[rc(idx)].lazy,Tree[idx].lazy);
            Tree[lc(idx)].lazy=min(Tree[lc(idx)].lazy,Tree[idx].lazy);
        }
        Tree[idx].lazy=INT_MAX;
    }
    if(L>qr || qe>R)
        return ;
    if(L>=qe && qr>=R)
    {
            Tree[idx].value=min(Tree[idx].value,e);
            if(L!=R)
                {
                    Tree[rc(idx)].lazy=min(Tree[rc(idx)].lazy,e);
                    Tree[lc(idx)].lazy=min(Tree[lc(idx)].lazy,e);
                }
            return ;
    }
    Update(L,mid(L,R),qe,qr,e,lc(idx));
    Update(mid(L,R)+1,R,qe,qr,e,rc(idx));
    Tree[idx]=Merge(Tree[lc(idx)],Tree[rc(idx)]);
    return ;
}

获取函数:
int Get(int L,int R,int qe,int idx)
{
    if(Tree[idx].lazy!=INT_MAX)
    {
        Tree[idx].value=min(Tree[idx].value,Tree[idx].lazy);
        if(L!=R)
        {
            Tree[rc(idx)].lazy=min(Tree[rc(idx)].lazy,Tree[idx].lazy);
            Tree[lc(idx)].lazy=min(Tree[lc(idx)].lazy,Tree[idx].lazy);
        }
        Tree[idx].lazy=INT_MAX;
    }
    if(L==qe && qe==R)
        return Tree[idx].value;
    if(qe<=mid(L,R))
        return Get(L,mid(L,R),qe,lc(idx));
    else
       return Get(mid(L,R)+1,R,qe,rc(idx));
}

请注意,实际问题需要的远不止这些它只是促进问题而不是真正解决问题!

最佳答案

实际上,我的代码真的很有用,它给了我正确的输出最近我发现我在别的地方犯了个错误。
我的段树说明如下:
1)建立一棵所有值+无穷大的树
2)现在,每当一个范围出现时,转到该范围,并将其标记为lazy,但在这里,我们不一定要更改值,我们取lazy的min值,因为它不是一个更新,而不是一个更多的值。!
3)当放松懒惰节点时,你不必改变懒惰的参数和值的最小值!
4)现在无论何时查询(点),惰性值都会向下遍历并给出正确的输出。
但我意识到我也可以通过简单的暴力!通过在复杂度O(n+m)中保持一个数组。

10-07 18:31