【发布时间】:2020-10-29 21:58:03
【问题描述】:
我们得到了一个大小为 N 的数组1 <= N <= 1e5,其中Ai 为正整数,这样
1 <= Ai <= 1e9。
我们将收到 Q 查询。 1 <= Q <= 1e5
每次查询都会有两个空格分隔的整数 b c , 1 <= b,c <= N
对于每个查询,我们都需要找到 Is moving from index b of array to index c of array possible ?,如果是,那么我们会找到一个特殊的总和,我在下面对此进行了解释。
我们不能简单地从i to i+1 索引移入数组,这是有限制的。如果我们想从i to j 移动,那么A[j] 应该严格大于A[i],即A[j] > A[i]。
请注意一件事:While moving we have to take the just next greater element than the current.
我们需要找到的sum 是到达目的地的路径中的元素总和。
举例
数组:3 2 5 4 6 6 7
查询:1 7
因此,根据查询,如果可能,我们需要从第一个元素移动到最后一个元素。
如,我们可以看到我们可以采取3 --> 5 --> 6 --> 7 路径到达目的地,总和是3+5+6+7 = 21
但是如果数组中的最后一个元素是2
数组:3 2 5 4 6 6 2
查询:1 7
对于此查询,我们无法到达目的地,因为在 6 之后,目的地元素 2 小于它。所以对于这个查询NO answer exist。
我的方法
我知道我可以在O(n) 中找到答案,只需从A(b) to A(c) 遍历数组并找出答案是否退出以及sum。
但问题是有很多查询,所以如果我使用O(n) 解决方案,时间复杂度将为O(QN)。
时间限制只有1 sec,所以我需要为此找到一个恒定的时间O(c)solution。
还有一件事 当第二类查询出现时,它变得更加困难。
查询类型 2:在此查询中,我们需要使用给定的K 更新索引处的值。
查询:b k,然后是A[b] = K。
谁能帮我解决这个问题??
【问题讨论】:
-
欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后,请edit 您的问题包括您自己尝试解决此问题的minimal reproducible example,以及您遇到的问题的描述。
-
哦,请注意,大 O 表示法是关于复杂性,而不是绝对时间或其他任何东西。对于时间复杂度,
O(1)中的1表示复杂度是恒定时间,这并不一定意味着它只需要一秒。 -
对不起,我是编程新手。我已经编辑了答案并删除了 c++14 标签。
-
我们不能有多个可能的总和吗?我们应该返回哪个金额?例如,给定 [1, 5, 4, 8],我们可以使用 4 或 5(但不能同时使用两者)从 1 到 8。
-
我们将从 1 到 5 然后到 8 ,我们不能从 1 到 4 因为 5 出现在 4 之前并且大于 1。我们必须移动并且必须采用下一个更大的元素。因此,如果从 1 移动到 8,我将取 1,那么下一个更大的元素是 5。所以我将取 5,然后下一个更大的元素是 8,因此将取 8。
标签: arrays algorithm optimization