无法解决codechef问题

时间:2011-05-31 15:43:33

标签: algorithm data-structures

(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))?如何?

提前致谢。

1 个答案:

答案 0 :(得分:2)

确实可以O(log(n)), O(log(n))

诀窍是让数据结构表示一棵树,每个节点都包含以下信息:

  • 开始索引
  • 结束指数
  • 左侧节点
  • 右节点
  • 多少0 mod(3)
  • 多少1 mod(3)
  • 多少2 mod(3)
  • 未应用的更新金额

当您被要求应用更新时,您只需将其(以及未应用的数量)应用于具有该范围内边界的节点。否则只需增加未应用的更新量。如果你需要,你会懒洋洋地应用它。

当您查询范围时,您可以懒惰地应用未应用的更新量并从右侧存储桶中获取,除非相关范围在树的该部分中具有索引范围内的边界。然后,只有这样,您是否需要将未应用的更新量降低到内部节点。

这两个操作只钻取到边界上树的一部分,因此O(log(n))