我正在解决以下问题:
连续有n个桶。一个园丁给水桶浇水。他每天都在位置 i 和 j (包括)之间挖掘水桶。他为不同的 i 和 j t 天做了这个。
假设最初零体积,输出水桶中的水量,每次浇水使体积增加1
。
输入:第一行包含空格分隔的 t 和 n 。 下一个 t 行包含 i 和 j 以空格分隔。
输出:一行显示空格分隔的 n 存储桶中的音量。
输入:
2 2
1 1
1 2
输出:
2 1
约束:
0 <= t <= 10 4 ; 1&lt; = n&lt; = 10 5
我试过这个问题。但我使用O(n * t)算法。每次在每一步时,我都会将桶从i增加到j。但是这显示了时间限制错误。有没有有效的算法来解决这个问题。一个小提示就足够了。
P.S:我使用C ++和Java作为标签bcoz程序可以用两种语言编程。
答案 0 :(得分:4)
不要记住每个水桶中的水量,而应记住每个水桶与前一个水桶之间的差异。
答案 1 :(得分:1)
有两个间隔列表,一个按上限排序,一个按下限
然后从卷0开始迭代n。
On each iteration over n
check if the next interval starts at n
if so increase v by one and check the next interval.
do the same for the upper bounds but decrease the volume
print v
repeat with the next n
答案 2 :(得分:1)
我认为这里的关键观察是你需要找出一种方法来表示你的(可能的)10个 5 桶而不实际为每个桶分配空间,并分别跟踪它们。你需要提出一个稀疏表示来跟踪你的桶和里面的水。
您的输入来自范围的事实为您提供了一个很好的提示:您应该在稀疏表示中使用范围。您只需跟踪每个范围两端的存储桶即可实现此目的。
我建议您使用链接列表执行此操作。每个列表节点将包含2条信息:
您认为当前水桶和下一个水桶之间的所有水桶都有相同的水量。
以下是一个例子:
Input:
5 30
1 5
4 20
7 13
25 30
19 27
这是算法的每一步会发生什么,第一步是初始状态,每一个连续步骤都是解析一条线后的步骤。
NULL
(所有桶都为0)NULL
(1-5有1,其余为0)NULL
NULL
NULL
你应该能够从上面的例子中推断出这种方法的复杂性实际上是 O(t 2 )而不是 O(n×t ),所以这应该更多更快。正如我在上面的评论中所说,这种方式的瓶颈实际上应该是解析和输出,而不是实际的计算。
答案 3 :(得分:-1)
这是一个具有空间和时间复杂度O(n)
的算法我正在使用java,因为我习惯了它
1)创建n个元素的哈希集 2)每次浇水时,增加各自的元素数量 3)文件解析完成后,迭代hashset计算结果。