关于我写错ls, rs定义却AC的这件事

P3372 【模板】线段树 1

Charlie查理 @ 2022-11-18 09:08:55

做别的题时写线段树,正常是这么写的:

#define ls (i << 1)
#define rs (i << 1 | 1)

然而我当时写错了,发现这样也能AC:

#define ls (mid << 1)
#define rs (mid << 1 | 1)

不是很明白原理,求分析qwq


by whhsteven @ 2022-11-18 10:02:37

我试了线段树 3(Seg Beats + 区间历史最值),可以通过。内存使用量变小了,但是时间变长了,大概是访存不连续。


by reveal @ 2022-11-18 10:09:50

或许跟 黑科技:数组两倍空间线段树,实现方便 - chy-2003 是等价的?


by SmallBlack @ 2022-11-18 10:21:04

花了一点时间证明,这种存法不会重复


by _LX_ @ 2022-11-18 10:28:10

那看来就是时间换空间了,在一些题目里还是有点用处的。所以,从现在开始,这种做法叫做查理线段树,建议加入NOI大纲和OIWiki(bushi


by Charlie查理 @ 2022-11-18 10:52:56

@reveal 确实是等价的


by Charlie查理 @ 2022-11-18 10:53:12

@SmallBlack orz谢谢大佬


by Charlie查理 @ 2022-11-18 10:55:11

@whhsteven 可以细说一下啥是访存不连续吗 /kk


by whhsteven @ 2022-11-18 11:12:49

就是内存访问不连续。这相比于连续访问会有额外的时间开销。大概这样。


by Z_302 @ 2022-11-18 12:37:50

@whhsteven 能讲一下为啥会内存访问不连续吗 QwQ


by optimize_2 @ 2022-11-18 21:09:28

这为什么会不连续

我也不理解


上一页 | 下一页