【HDU 1754】びっくり!max()着信時関数がタイムアウトしました.

1447 ワード

ソースリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1754
この問題は裸の線分樹の区間の一番の値+単点の修正ですが、巨大な穴があります.
return max(cnt,query(i/2,j/2));         //  

  :
int q=query(i/2,j/2);
return cnt>q?cnt:q;                    //AC
なぜですか?max()はマクロ定義なので、
#define max(x1, y1) ((x1) > (y1) ? (x1) : (y1))
元のコードの展開後:
 cnt>query(i/2,j/2) ? cnt : query(i/2,j/2);
クエリー関数は2回実行されます.
acコード:
#include
#include
#include
#include
#include
#include
#include
#include 
using namespace std;
int tree[200000*4];

void updata(int i,int num){
    tree[i]=num;
    i/=2;
    while(i>=1){
        tree[i]=tree[i*2]>tree[i*2+1]?tree[i*2]:tree[i*2+1];
        i/=2;
    }
}

int query(int i,int j){
    if (j-i==1) return max(tree[i],tree[j]);
    if (j==i) return tree[i];
    int cnt=0;
    if (i%2!=0){
        cnt=tree[i];
        i++;
    }
    if (j%2==0){
        if (cntq?cnt:q;
}   

int main()
{
    int n,m,N,a,x,y;
    char c;
    while(~scanf("%d%d",&n,&m)){
        memset(tree,0,sizeof(tree));
        N=1;
        while(N