问题描述
|
(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”。
诀窍是要有一个由数据结构表示的树,并在每个节点上具有以下信息:
起始索引
结束索引
左节点
右节点
多少个0 mod(3)
多少个1 mod(3)
多少2 mod(3)
未应用的更新量
当要求您应用更新时,只需要将其(以及未应用的数量)应用到边界在该范围内的节点。否则,只需增加未应用的更新量即可。如果需要,您会懒惰地应用它。
当查询范围时,您可以懒惰地应用未应用的更新量并从正确的存储桶中获取数据,除非所讨论的范围在树的该部分的索引范围之内。然后,直到那时,您才需要将未应用的更新量降低到内部节点中。
两种操作都仅钻入边界上树的一部分,因此均为
O(log(n))
。