第一次做线段树的入门题目,写很多次都超时,最后发现是我的宏定义的问题
#define max(a, b) (a) > (b) ? a : b
在queryTree()中当要询问的区间在左右区间的时候
我起初写:
return max(queryTree(left, mid, LL), queryTree(mid + 1, right, RR));
结果一直超时,很是郁闷!!!
最后改成:
int a = queryTree(left, mid, LL);
int b = queryTree(mid + 1, right, RR);
return max(a, b);
然后果断AC了用时500ms。
思考许久后发现这个是宏定义的问题,宏定义在预编译的时候进行字符替换。
第一种写法替换后变成:
queryTree(left, mid, LL) > queryTree(mid + 1, right, RR) ? queryTree(left, mid, LL) : queryTree(mid + 1, right, RR);
第二种写法替换后变成:
a > b ? a : b;
显然第一种写法queryTree多调用了2次必然超时。