今天写李超线段树板子的时候遇到了一个神奇的问题:
为了快点,我写了个宏定义:
#define max(a,b) (((a)>(b))?(a):(b))
然后在李超线段树的查询函数中用到了max:
double ask(int k,int l,int r,int x){
if(l==r) return L[p[k].val].ask_val(x);
int mid=(l+r)>>1;
double res=L[p[k].val].ask_val(x);
if(x<=mid) return max(res,ask(p[k].lc,l,mid,x));
else return max(res,ask(p[k].rc,mid+1,r,x));
}
然后TLE了调了INF年
最后发现,把max里面两个东西交换位置就过了:
if(x<=mid) return max(ask(p[k].lc,l,mid,x),res);
else return max(ask(p[k].rc,mid+1,r,x),res);
有没有大佬知道是为什么啊,蒟蒻拜谢Orz