这是比赛的结果!
我假设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)中保持一个数组。