在给定值的区间时找到每个点的最小值(见正文)
Finding Minimum Value of each point when interval with values are given(See Body)
这是一场比赛!
我假设 M 个 [L,R] 类型的区间,(1<= L , R <= N ) 每个区间的成本为 Ci。
现在这些间隔不能作为一个整体(我们可以拆分它们!)
拆分后,我必须报告可能的最小值,即如果 i (1<=i <=N) 属于 K 个区间,我想要包含 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));
}
请注意,实际问题远不止于此!这只是解决问题而不是解决问题![=12=]
实际上我的代码确实有效,它给了我正确的输出。最近我发现我在其他地方犯了一个错误。
我的线段树的解释如下:
1) 构建一棵所有值为 +INFINITY
的树
2) 现在,无论何时出现一个范围,直到该范围并将其标记为 child 为惰性,但在这里我们不一定要更改值,我们取惰性值的最小值只是因为它不是更新而是不止一个价值。!
3) 放宽Lazy节点时,不一定要改取Lazy参数的最小值和取值!
4) 现在无论何时你查询(for point),惰性值都会向下遍历并给你正确的输出。
但我意识到我也可以通过简单的蛮力来做到这一点!通过维护一个复杂度为 O(N+M) 的数组。
这是一场比赛! 我假设 M 个 [L,R] 类型的区间,(1<= L , R <= N ) 每个区间的成本为 Ci。 现在这些间隔不能作为一个整体(我们可以拆分它们!) 拆分后,我必须报告可能的最小值,即如果 i (1<=i <=N) 属于 K 个区间,我想要包含 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));
}
请注意,实际问题远不止于此!这只是解决问题而不是解决问题![=12=]
实际上我的代码确实有效,它给了我正确的输出。最近我发现我在其他地方犯了一个错误。 我的线段树的解释如下: 1) 构建一棵所有值为 +INFINITY
的树2) 现在,无论何时出现一个范围,直到该范围并将其标记为 child 为惰性,但在这里我们不一定要更改值,我们取惰性值的最小值只是因为它不是更新而是不止一个价值。!
3) 放宽Lazy节点时,不一定要改取Lazy参数的最小值和取值!
4) 现在无论何时你查询(for point),惰性值都会向下遍历并给你正确的输出。
但我意识到我也可以通过简单的蛮力来做到这一点!通过维护一个复杂度为 O(N+M) 的数组。