关于宏定义max/min的问题

P2880 [USACO07JAN] Balanced Lineup G

典。 你考虑一下线段树 `max(query left,query right)`,这样会展开然后把左右分别查询两次。
by SlaineTroyard @ 2023-10-11 17:58:14


这玩意复杂度多少啊有没有佬浇浇,是不是和今年初赛龟速幂一样啊/kel
by SlaineTroyard @ 2023-10-11 17:59:05


典。 别宏定义 `min/max` 了,你手玩一下替换出来什么,就能发现好的情况是双倍常数,差的情况就是奇奇怪怪的错误加上双倍常数。
by fangzichang @ 2023-10-11 18:05:41


@[_Virgo_](/user/571589) @[SlaineTroyard](/user/450246) 这应该是 $O(n)$,因为比如你更新一个节点,要取左右子树的 $\max$,那么会把左右子树至多询问两次,由于线段树高度 $O(\log n)$,所以可以卡到 $O(2^{\log n})=O(n)$?(如果不对指出一下,我对线段树没那么了解
by Bingxiu @ 2023-10-11 18:15:46


@[fangzichang](/user/678087) 不止双倍常数吧,楼主的情况应该是O(logn)变成O(n)了
by GoldenFishX @ 2023-10-11 18:16:36


@[Big_Caibi](/user/156353) 是这样的。 反正这种陋习早就该杜绝了,编译器可没有那么蠢,翻翻源代码就知道 `std` 的实现和这个等价。 ~~还能自动 CE 防止胡乱隐式转换导致的奇奇怪怪的问题~~
by fangzichang @ 2023-10-11 18:18:45


@[Bingxiu](/user/676498) 好的好的 orz
by SlaineTroyard @ 2023-10-11 18:20:32


定义函数尽可能不要使用 `define` 以防止莫名其妙的错误。
by E1_de5truct0r @ 2023-10-11 20:23:26


|