HDU 1754 I Hate It

线段树单点更新模板题。

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1754

这个实现的效率比较低。比大小必须写成函数才不会TLE。

View Code
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define N 500000
 5 struct node
 6 {
 7     int l,r; 
 8     int sum;
 9 }xtree[4*N];
10 int max(int a,int b)
11 {
12     return a>b?a:b;
13 }
14 void pushup(int rn)
15 {
16     xtree[rn].sum=max(xtree[rn<<1].sum,xtree[rn<<1|1].sum);
17 }
18 void build(int l,int r,int rn)
19 {
20     xtree[rn].l = l;
21     xtree[rn].r = r;
22     if(l == r)
23     {
24         scanf("%d",&xtree[rn].sum);
25         return ;
26     }
27     int mid=(l+r)>>1;
28     build(l,mid,rn<<1);
29     build(mid+1,r,rn<<1|1);
30     pushup(rn);
31 }
32 void update(int num,int val,int rn)
33 {
34     if(xtree[rn].l==xtree[rn].r)
35     {
36         xtree[rn].sum =val;
37         return ;
38     }
39     int mid=(xtree[rn].l+xtree[rn].r) >> 1;
40     if(num>mid)
41     {
42         update(num,val,rn<<1|1);
43     }
44     else
45     {
46         update(num,val,rn<<1);
47     }
48  pushup(rn);
49 }
50 int que(int le,int ri,int rn)
51 {
52     if(xtree[rn].l==le&&xtree[rn].r==ri)
53     {
54         return xtree[rn].sum;
55     }
56     int mid=(xtree[rn].l + xtree[rn].r) >> 1;
57     if(le>mid)
58     {
59         return que(le,ri,rn<<1|1);
60     }
61     else if(ri<=mid)
62     {
63         return que(le,ri,rn<<1);
64     }
65     else
66     {
67         return  max(que(le,mid,rn<<1),que(mid+1,ri,rn<<1|1));
68     }
69 }
70 int main()
71 {
72     int n,m,a,b;
73     char str[10];
74     while(~scanf("%d%d%",&n,&m))
75     {
76         build(1,n,1);
77         while(m--)
78         {
79    scanf("%s%d%d",str,&a,&b);
80             if(str[0]=='Q')
81             {
82                 printf("%d\n",que(a,b,1));
83             }
84             else if(str[0] =='U')
85             {
86                 update(a,b,1);
87             }
88   }
89        
90     }
91     return 0;
92 }

 

posted @ 2012-08-15 20:54  时光旅行的懒猫  阅读(168)  评论(0编辑  收藏  举报