【问题标题】:Overlapping Intervals and Minimum Values重叠区间和最小值
【发布时间】:2015-01-03 06:58:54
【问题描述】:

您如何确定是否存在一组满足特定给定条件的值。标准采用区间和该区间内的最小值的形式。

例如,给定条件:

Interval : Minimum value in that interval

{2, 2}   : 5
{1, 4}   : 1
{4, 4}   : 4

可以满足的一组值是

{1, 5, 1, 4}

另一方面,给定标准:

Interval : Minimum value in that interval

{2, 3}   : 1
{1, 4}   : 2
{4, 4}   : 4

不存在满足它们的这样一组值。

我想确定是否存在一组满足给定条件的值(即,我只想找到一个算法,如果存在一组满足条件的值,则返回 true,如果不满足,则返回 false )。

我知道如何使用 O(N^2) 蛮力来做到这一点,但如果可能的话,我想实现 O(N lgN) 解决方案。


我第一次尝试解决这个问题涉及合并重叠区间,然后检查合并区间的最小值,但我很快意识到这样做并不一定能保证正确答案。

我的第二次尝试涉及分段树,即尝试为每个值分配值,如果您试图覆盖一个区间,则不存在这样的区间。但是,这也很快被放弃了,因为即使某些部分被覆盖,您仍然可以在一组有效的值上实现。

我的第三次尝试涉及区间树,试图找到两个区间之间的交点并检查是否可以创建一组有效的值。这看起来很有希望,但它是一个 O(N^2) 算法,所以也被放弃了。

谁能提供一些见解?

【问题讨论】:

标签: algorithm computational-geometry intersection intervals


【解决方案1】:

赋值的想法是正确的。您只需要按其最小值(按递增顺序)对间隔进行排序。也就是说,解决方案如下所示:

  1. 构建分段树(在所有节点中具有 -infinity 值)。

  2. 按排序顺序处理所有间隔。对于每个间隔,只需分配其值(无论之前有什么)。

  3. 对所有间隔运行查询以检查一切是否正确。

唯一不平凡的陈述是:如果这个算法没有找到解决方案,那么就没有解决方案。我不会发布正式的证明,但这里有一些关键的观察:

  1. 当我们按排序顺序处理它们时,我们必须为整个区间分配一个新值。

  2. 我们不会在其他任何地方分配新值(也就是说,我们不能意外地破坏另一个间隔的值)。

【讨论】:

  • 排序是指使用左端点作为键按升序排序,对吗?并且要澄清一下,对于分配值,您的意思是进行标准的段树范围更新(除了在您替换的叶节点处更新,然后在向上的过程中合并更改)。另外,段树应该是最小段树吧?
  • 另外,你已经回答了我问过的几乎所有算法问题:O(我会送你一些赏金作为感谢)。你是如何变得如此擅长算法思维的?您是否参加过 codeforces/USACO(或同等机构)?
  • @1110101001 间隔应按其最小值排序(不是左边界或右边界)。通过更新我的意思是为整个间隔分配一个值。是的,段树是最小段树。
  • @1110101001 关于参加在线比赛:我确实积极参加 CodeForces 和 TopCoder 比赛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多