线段树单点更新模板题。
题目链接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 }