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 }

 

posted on 2012-07-26 15:57  usp10  阅读(161)  评论(0编辑  收藏  举报

导航