我正在解决在http://www.spoj.com/problems/LIS2/.I遇到的问题LIS2
2D段树,但我想它不适合这个问题。我读到misof
解决方案
关于spoj的NICEDAY
,根据这篇文章类似于这个问题:
http://apps.topcoder.com/forums/;jsessionid=F39EBDDC41BEB792536BE044ADC8BA2A?module=Thread&threadID=615154&start=0&mc=2。
我也不能理解这两个问题之间的联系,我也无法理解
错误解决NICEDAY
的复杂性。
PS:我不想要整个解决方案我也不希望任何方法通过2D段树, 因为这个问题太复杂了(我试过了)
答案 0 :(得分:1)
想想如何解决一维问题:
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)
,这根本不应该太复杂。这涉及使用其节点也是分段树的分段树。
答案 1 :(得分:0)
对我来说,我认为我们不能使用2D Segment Tree来解决这个问题,因为对于2D Segment Tree来说,我们需要最多10 ^ 5 x 10 ^ 5的表,这个表太大了。