神秘代码

P3835 【模板】可持久化平衡树

UB 大师
by Nt_Tsumiki @ 2024-02-21 09:18:13


![](https://cdn.luogu.com.cn/upload/image_hosting/yttdv1jo.png?x-oss-process=image/resize,m_lfit,h_170,w_225)
by zky2023 @ 2024-02-21 09:33:24


@[ZepX_D](/user/464004) x,y确实不会变,但是i会变。如果把i的引用去掉就对了。
by Killer_joke @ 2024-02-21 10:02:21


@[ZepX_D](/user/464004) 因为 ```split(rs[i],k,rs[i],y)``` 这句中x和i相同,而x有可能被修改导致进行pushup的时候i因为和x是同一个引用也被修改成了错误的值。
by Killer_joke @ 2024-02-21 10:04:12


@[Killer_joke](/user/915814) 在什么情况下 x 会被修改,`split(rs[i],k,rs[i],y)` 两个变量都取 `rs[i]` 的地址应该会出锅,但是 x 和 i 并没有往下传,为什么这两个值会被修改呢?
by ZepX_D @ 2024-02-21 10:09:44


@[ZepX_D](/user/464004) 不,我的意思是说这样的话递归下去之后那个函数中x和i引用的东西是一样的,所以有可能后面修改了x导致i也跟着被修改引起错误。
by Killer_joke @ 2024-02-21 10:45:29


@[ZepX_D](/user/464004) 就是它走的流程是这样的,因为刚才的所说的原因传入的参数里的x和i是对同一个东西的引用,然后再走了 ```split(ls[i],k,x,ls[i])``` 导致x被修改,带着i一起被改了,这时候再pushup(i)的时候i就错了,如果i不传成引用则两种写法均正确。
by Killer_joke @ 2024-02-21 10:48:47


@[Killer_joke](/user/915814) 拜谢,明白 x 在下面会被改进而影响 i 了,那本层的 x 和 i 是如何被改的不同的?
by ZepX_D @ 2024-02-21 11:00:10


@[ZepX_D](/user/464004) x和i被改的不同的情况发生的时候本层是i和y是对同一个变量的引用。因此调用```split(rs[i],k,rs[i],y)```之后对y的修改使得i也被修改了,因此再pushup(i)和pushup(x)就有区别了。
by Killer_joke @ 2024-02-21 14:34:55


@[Killer_joke](/user/915814) 我去懂了,谢谢
by ZepX_D @ 2024-02-21 15:33:04


|