我给出的数组A
由整数组成,我必须选择数组A中的任意两个整数和范围[L,R]
中的任何第三个整数,这样所有三个整数都形成一个有效的三角形。 / p>
我必须通过从数组A中选择任意两个值来找到范围[L,R]中可用于形成有效三角形的整数。
我知道如果我知道双方,那么第三方必须是范围a-b<x<a+b
其中a和b是A中的任意两个整数。
如何在O(N) N= Size of A
时间内找到[L,R]中的有效整数数。
L和R并且非常大到10^20
答案 0 :(得分:0)
据我了解,完整的枚举将通过以下参数产生有效的解决方案。在任何选择A
元素的情况下,会出现最大数量的可能解决方案,从而为三角形提供一致的边长选择。例如,这样的输入将是值N
的{{1}}倍的输入。但是,从1
中选择的三元组数量可以通过
A
(其中(n choose 3) = n!/(3!(n-3))
= n!/(6(n-3)!)
= (1/6)*(n-2)*(n-1)*n
<= n^3
表示二项式系数),它是多项式数的选择。任何选择都可以在恒定时间内检查有效性,因为只涉及3个值。
答案 1 :(得分:0)
现在比赛已经结束,所以这是我在比赛中解决问题的方法。
问题在于询问x
中[L,R]
的{{1}}个数与(a_i, a_j)
中的任何一对A
形成三角形。
天真的方法是对O(N^2 * (R-L+1))
= O(N^2 * (R-L))
但实际上,我们不需要测试所有O(N^2)
对,我们只需要测试O(N)
对 IF A
已排序,即全部对于i&gt;的相邻对(a_i-1, a_i)
0
为什么呢?因为在排序A
中:
如果某对(a_j, a_i)
位于a_j < a_i and j != i-1
,可以与x
形成三角形
然后(a_i-1, a_i)
必须与x
形成一个三角形:
a_i-1 + a_i > a_j + a_i > x
x + a_i-1 > x + a_j > a_i
- 醇>
x + a_i > x + a_i-1 > a_j
因此,检查所有(a_i-1, a_i)
就足够了,这是解决此问题的第一个核心思路。
现在我们有O(NlgN + N*(R-L+1))
= O(N*(R-L))
算法。
对于原始的比赛问题,它仍然太慢,因为R-L+1
大到10 ^ 18,所以我们需要另外一些技巧。
请注意,实际上通过三角形不等式,对于一对(a_i-1, a_i)
,我们确实可以找到一个范围x
,它可以与此对形成三角形:
a_i-1 + a_i > x > a_i - a_i-1 (By above 1 & 2)
x
&lt; 9
因此,我们不会迭代x
中的所有[L,R]
,而是尝试为每对x
寻找范围,这可以在O(N)
中完成,因为我们知道范围x
中对O(1)
的{{1}}。请注意x
必须落在[L,R]
范围内。
之后我们有O(N)
x
的范围/段,然后我们可以将它们联合起来,结果集的大小就是所需的答案。
联盟O(N)
细分也可以在O(N)
中轻松完成,我会将您留作家庭作业:)
结合两种技巧,算法为O(N lg N + N + N)
= O(N lg N)