我正在解决 spoj 上的 LIS2 问题 http://www.spoj.com/problems/LIS2/.I 遇到了
2D 段树,但我想它不适合这个问题。我阅读了 misof 解决方案
根据这篇文章,spoj 上的 NICEDAY 与此问题类似:
http://apps.topcoder.com/forums/;jsessionid=F39EBDDC41BEB792536BE044ADC8BA2A?module=Thread&threadID=615154&start=0&mc=2
我也无法理解这两个问题之间的联系,我也无法理解
misof 对 NICEDAY 的解决方案的复杂性。

PS:我不想要整个解决方案,也不想要任何通过 2D 线段树的方法,
因为这个问题太复杂了(我试过了)

最佳答案

想想你将如何解决一维问题:

dp[i] = longest increasing subsequence that ends at position i.

对于每个 i ,我们必须将 a[i] 附加到 j 使得 dp[j]a[j] < a[i] 最大。通过更改 dp 数组的定义,我们可以使用高级数据结构有效地找到这一点:
dp[i] = longest increasing subsequence that ends with the VALUE i

现在,最初为每个位置 dp[ a[i] ] = 1 设置 i 。然后对于每个元素 a[i] ,您需要 dp[0], dp[1], ..., dp[ a[i] - 1 ] 的最大值。然后你有 dp[ a[i] ] = mx + 1

您可以通过规范化数组值来找到此最大值(确保它们都在 [1, n] 区间内)。你可以用排序来做到这一点。例如,如果您的数组是 42 562 13 ,那么 n = 3 和您的新数组将是 2 3 1

这可以通过支持最大查询和更新的段树轻松实现。时间复杂度为 O(n log n)

通过使用 2D 段树,获得时间复杂度 O(n log^2 n) ,这可以很容易地扩展到您的问题,这根本不应该太复杂。这涉及使用其节点也是线段树的线段树。

关于algorithm - spoj 上的 LIS2 方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17378305/

10-14 08:05