具有段树和延迟传播的DP

时间:2017-08-18 01:12:30

标签: algorithm dynamic-programming lazy-evaluation segment-tree

我读到了一个非常简单的问题,并尝试进一步复杂化,并包含其他概念。但我一度陷入困境,现在无法进一步解决。

问题1:您将获得一个数组,现在有Q查询,您必须找到此数组中任何元素的下一个更大元素。

Ex:数组:1,2,4,3,5然后下一个2的更大元素是4,下一个更大的元素4是5但是5没有任何下一个更大的元素。< / p>

解决方案:您可以简单地使用Stack,并且可以在O(max(n,Q))中求解。这可以找到here

问题2:现在你必须找出下一个更大的元素,但是当我说下一个更大的元素时,我的意思是,贪婪地制作一个严格增加的数组,从给定的元素开始并告诉我的元素。 (如果你仔细观察它与问题1有关)。

Ex:在1,2,4,3,5中,2的第2个更大的元素是5而不是3.因为从2开始增加数组将是2,4,5并且贪婪地

解决方案:这可以用DP来解决,因为我将制作一个nx log(n)和i的数组,表中的j元素将存储下一个2 ^ j的更大的元素索引元件。这个表可以像这样轻松填写:

dp [i] [j] = dp [dp [i] [j-1]] [j-1];

其中第0列使用堆栈填充,因为我们在问题1中解决了它。因此查询Complexity将是O(nlog(i))并且空间复杂度将是O(nlog(n))。

问题3:现在让问题1动态化。现在让我们说我们可以通过增加或减少某个数字来更新一系列数组。并查询第i个元素的下一个更大元素。

Ex:数组:1,2,4,3,5。下一个4的更大元素是5.但是让我说我​​将范围[4,5]更新为3然后新的数组将是1,2,4,6,8。现在,下一个4的更大元素是6。

解决方案:我无法以合理的复杂性解决这个问题,但我在这里观察到的一点是,如果你要更新一个范围,那么只会影响那些元素(下一个更大的元素会改变)它们位于范围内但是它们的下一个更大的位于范围外且位于范围的左侧但是它们的下一个更大的元素位于范围的内侧或右侧。

所以,我稍微调整了一下,然后说你必须在小的下一个范围内看到下一个更大的元素,如果存在更大的元素,那么OK,否则说它-1。对于Ex:如果小范围是2,则4,3,2,6,5,7中的6的下一个更大元素是7但是4是无或者说-1。因为6位于3的距离。

现在可以通过将Segment Tree纳入图片来解决这个问题。每当有范围[lower,upper] 更新时,我们只需更新左侧部分(lower-smallRange,lower + smallRange)和右侧部分(upper-smallRange,upper + smallRange)的解决方案其中(lower-smallRange,lower)和(upper-smallRange,upper)的解决方案仅更新(从逻辑上方可以看出)。在应用问题1中使用的堆栈方法时,您必须在使用O(log(n))中的Segment Tree进行多个范围更新后获得索引处的当前值。所以这可以在O(q * smallRange * log(n))中求解,其中q是查询数。

问题4(主要问题):现在让我们结合问题2和问题3,因为现在会有两种类型的查询,在第一个查询中你必须找到更多的元素给定的元素。在第二个查询中,您可以通过某个数字更新范围。即使包含我在问题3中使用的smallRange概念,我也无法解决它。

Ex:数组:1,2,4,3,5。这里第二个下一个2的更大元素是5.但是让我说我​​将范围[4,5]更新为3然后新数组将是1,2,4,6,8。现在,第二个下一个更大的元素是6。

解决方案:我正在考虑将我在问题2和3中使用的两种解决方案混合使用,但主要问题是,在dp表格中,除了smallRange之外的元素(如问题3中所述)会受到影响,因为表中使用的2 ^ j概念。它会严重影响复杂性。换句话说,我无法从问题3中使用的smallRange那里获得帮助。我也试图在dp表中使用延迟传播,但这也无济于事。

我知道这是一个很长的问题,但我试图逐步解释它。希望有人会在这里阅读并帮助我。

0 个答案:

没有答案