【HDU 1754】震惊!max()传入耗时函数导致超时。

原题链接: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);

查询函数执行了两次。。

ac代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<cmath>
#include<queue>
#include<string>
#include<cstring>
#include<algorithm> 
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 (cnt<tree[j]) cnt=tree[j];
        j--;
    }
    int q=query(i/2,j/2);
    return cnt>q?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<n) N*=2;
        for (int i=1;i<=n;++i){
            scanf("%d",&a);
            updata(N-1+i,a);
        }
        while(m--){
            getchar();
            scanf("%c %d %d",&c,&x,&y);
            if (c=='Q') printf("%d\n",query(N-1+x,N-1+y));
            else if (c=='U') updata(N-1+x,y);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 相信每一位玩ACM程序设计竞赛的同学来说,都有一个从入门到精通的过程,而且分享他们经验的时候,见到最多的就是一种合...
    FinlayLiu阅读 10,813评论 6 182
  • 在已知了树状数组的使用方法,那么便可以用它来解决一些实际问题了,比如说下面一道经典题:敌兵布阵 :HDU:1166...
    碧影江白阅读 4,739评论 0 2
  • 主席树的作用是寻找一个序列的某个区间的第k大(小)如:给出一个序列a1,a2...an,有若干个询问,每个询问形如...
    Gitfan阅读 3,570评论 0 0
  • 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556Proble...
    sugar_coated阅读 4,793评论 0 2
  • 穷人之所以穷是因为 第一,避免风险的手段太落后 第二,他们只顾眼前利益,不做任何长远规划打算 第三,因为认知水平的...
    星思阅读 2,635评论 0 0

友情链接更多精彩内容