hdu1754 i hate it(题解)

来源:互联网 发布:淘宝代装修 编辑:程序博客网 时间:2024/05/17 01:11

这道题果然是i hate it,虽然是线段树的最最基础题,但我tle了30,40发,debug一个月多才知道tle在哪里。
由于我是用纯C写的,没有c++中max函数,我就自己用预处理宏,写了一个,对,tle就在这里,如果你是用c++里面的max就ac了。
我tle的代码(把复杂函数扔进预处理宏纯粹是作死!!!!)

#include <stdio.h>#define mMax(X,Y) ((X)>(Y)?(X):(Y))int tree[800011],N;void build(int tn,int left,int right){    int mid;    if(left==right) {scanf("%d",tree+tn);return;}    mid=(left+right)>>1;    build(tn<<1,left,mid);    build(tn<<1|1,mid+1,right);    tree[tn]=mMax(tree[tn<<1],tree[tn<<1|1]);}void chang(int tn,int left,int right,int x,int num){    int mid;    if(left==right) {tree[tn]=num;return;   }    mid=(left+right)>>1;    if(x<=mid) chang(tn<<1,left,mid,x,num);    else chang(tn<<1|1,mid+1,right,x,num);    tree[tn]=mMax(tree[tn<<1],tree[tn<<1|1]);}int find(int tn,int left,int right,int x,int y){    int mid,sum=0;    if(x<=left&&right<=y) return tree[tn];    mid=(left+right)>>1;    if(x<=mid) sum=mMax(sum,find(tn<<1,left,mid,x,y));     if(y>mid) sum=mMax(sum,find(tn<<1|1,mid+1,right,x,y));    return sum;}int main(int argc, char const *argv[]){    int M,a,b;    char str[5];    while(scanf("%d %d",&N,&M)==2)    {        build(1,1,N);        while(M--)        {            scanf("%s %d %d",str,&a,&b);            if(str[0]=='U') chang(1,1,N,a,b);            else printf("%d\n",find(1,1,N,a,b) );        }    }    return 0;}

ac的代码,唯一区别就是我用了c++中的max。。。。。。生无可恋

#include <algorithm>#include <stdio.h>using namespace std;int tree[800011],N;void build(int tn,int left,int right){    int mid;    if(left==right) {scanf("%d",tree+tn);return;}    mid=(left+right)>>1;    build(tn<<1,left,mid);    build(tn<<1|1,mid+1,right);    tree[tn]=max(tree[tn<<1],tree[tn<<1|1]);}void chang(int tn,int left,int right,int x,int num){    int mid;    if(left==right) {tree[tn]=num;return;   }    mid=(left+right)>>1;    if(x<=mid) chang(tn<<1,left,mid,x,num);    else chang(tn<<1|1,mid+1,right,x,num);    tree[tn]=max(tree[tn<<1],tree[tn<<1|1]);}int find(int tn,int left,int right,int x,int y){    int mid,sum=0;    if(x<=left&&right<=y) return tree[tn];    mid=(left+right)>>1;    if(x<=mid) sum=max(sum,find(tn<<1,left,mid,x,y));    if(y>mid) sum=max(sum,find(tn<<1|1,mid+1,right,x,y));    return sum;}int main(int argc, char const *argv[]){    int M,a,b;    char str[5];    while(scanf("%d %d",&N,&M)==2)    {        build(1,1,N);        while(M--)        {            scanf("%s %d %d",str,&a,&b);            if(str[0]=='U') chang(1,1,N,a,b);            else printf("%d\n",find(1,1,N,a,b) );        }    }    return 0;}
0 0