(O(n),O(log n))方法是否足以解决问题 - http://www.codechef.com/problems/MULTQ3/?
(更新时间 - O(n),查询时间 - O(log n))
我的解决方案 - 使用上述方法(使用分段树)解决了由Codechef法官提交的“TLE”提交。
好吧,我甚至尝试了(O(log n),O(n))方法解决问题(更新时间 - O(log n),查询时间 - O(n)),但即便如此被拒绝Codechef法官超过时限。我不知道从现在开始到哪里去。这是我第二次提交的链接 - http://www.codechef.com/viewsolution/558614
任何已经解决问题的人都被要求帮我解决这个问题。 我能做到吗(O(lgn)-O(lgn))?如何?
提前致谢。
答案 0 :(得分:2)
确实可以O(log(n)), O(log(n))
。
诀窍是让数据结构表示一棵树,每个节点都包含以下信息:
当您被要求应用更新时,您只需将其(以及未应用的数量)应用于具有该范围内边界的节点。否则只需增加未应用的更新量。如果你需要,你会懒洋洋地应用它。
当您查询范围时,您可以懒惰地应用未应用的更新量并从右侧存储桶中获取,除非相关范围在树的该部分中具有索引范围内的边界。然后,只有这样,您是否需要将未应用的更新量降低到内部节点。
这两个操作只钻取到边界上树的一部分,因此O(log(n))
。