hdu1754 i hate it
又是一道线段树的题目,还是单点更新的,加查询区间最大值,一开始写出来是超时,郁闷,后来百度到有人跟我情况差不多得,用了max(a,b),直接max(check,check)这样,导致了check的重复操作,因为max(a,b)是a>b?a:b这样会重复执行多一次a或者b,所以超时了,改完后就内存爆了。。。
于是改成数组,果断ac,但时间要1s多,要怎么优化呢??
View Code
1 #include<stdio.h> 2 #include<malloc.h> 3 #define max(a,b) a>b?a:b 4 struct p 5 { 6 int u,v; 7 int great; 8 }head[800000]; 9 int n,m; 10 int buildtree(int n,int i,int j) 11 { 12 head[n].u=i; 13 head[n].v=j; 14 if(i!=j) 15 { 16 buildtree(2*n,i,(i+j)/2); 17 buildtree(2*n+1,(i+j)/2+1,j); 18 head[n].great=max(head[2*n].great,head[2*n+1].great); 19 }else 20 scanf("%d",&head[n].great); 21 return 0; 22 } 23 24 int check(int n,int i,int j) 25 { 26 int mid=(head[n].u+head[n].v)/2; 27 if(i==head[n].u&&j==head[n].v) 28 return head[n].great; 29 else 30 if(j<=mid) 31 return check(2*n,i,j); 32 else 33 if(i>mid) 34 return check(2*n+1,i,j); 35 else 36 { 37 int a=check(2*n,i,mid); 38 int b=check(2*n+1,mid+1,j); 39 return max(a,b); 40 } 41 } 42 43 int update(int n,int i,int j) 44 { 45 int mid=(head[n].u+head[n].v)/2; 46 int a; 47 if(head[n].u==i&&head[n].u==head[n].v) 48 return head[n].great=j; 49 else 50 if(i<=mid) 51 { 52 int b; 53 b=update(2*n,i,j); 54 a=max(b,head[2*n+1].great); 55 } 56 else 57 { 58 int b=update(2*n+1,i,j); 59 a=max(b,head[2*n].great); 60 } 61 return head[n].great=a; 62 } 63 64 65 int main() 66 { 67 int t; 68 while(scanf("%d%d",&n,&m)!=EOF) 69 { 70 buildtree(1,1,n); 71 for(t=0;t<m;t++) 72 { 73 char c; 74 int i,j; 75 getchar(); 76 scanf("%c",&c); 77 scanf("%d%d",&i,&j); 78 if(c=='Q') 79 printf("%d\n",check(1,i,j)); 80 else 81 update(1,i,j); 82 } 83 } 84 return 0; 85 }