HDU 1754 I Hate It(线段树版)
找最大,这里居然会超时。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define N 200001 5 struct node 6 { 7 int l; 8 int r; 9 int v; 10 }tree[4*N]; 11 int max(int a,int b) 12 { 13 return a>b?a:b; 14 } 15 void build(int l,int r,int rt) 16 { 17 int m; 18 tree[rt].l = l; 19 tree[rt].r = r; 20 if(l == r) 21 { 22 scanf("%d",&tree[rt].v); 23 return ; 24 } 25 m = (l+r)>>1; 26 build(l,m,rt<<1); 27 build(m+1,r,rt<<1|1); 28 tree[rt].v = max(tree[rt<<1].v,tree[rt<<1|1].v); 29 } 30 void update(int pos,int sc,int rt) 31 { 32 int m; 33 if(tree[rt].l == tree[rt].r) 34 { 35 tree[rt].v = sc; 36 return ; 37 } 38 m = (tree[rt].l + tree[rt].r) >> 1; 39 if(pos > m) 40 { 41 update(pos,sc,rt<<1|1); 42 } 43 else 44 { 45 update(pos,sc,rt<<1); 46 } 47 tree[rt].v = max(tree[rt<<1].v,tree[rt<<1|1].v); 48 } 49 int query(int L,int R,int rt) 50 { 51 int m; 52 if(L == tree[rt].l&&R == tree[rt].r) 53 { 54 return tree[rt].v; 55 } 56 m = (tree[rt].l + tree[rt].r) >> 1; 57 if(L > m) 58 { 59 return query(L,R,rt<<1|1); 60 } 61 else if(R <= m) 62 { 63 return query(L,R,rt<<1); 64 } 65 else 66 { 67 return max(query(L,m,rt<<1),query(m+1,R,rt<<1|1)); 68 } 69 } 70 int main() 71 { 72 int n,i,m,x,y; 73 char str[100]; 74 while(scanf("%d%d%*c",&n,&m)!=EOF) 75 { 76 memset(tree,0,sizeof(tree)); 77 build(1,n,1); 78 for(i = 1;i <= m;i ++) 79 { 80 scanf("%s%d%d",str,&x,&y); 81 if(str[0] == 'Q') 82 { 83 printf("%d\n",query(x,y,1)); 84 } 85 else if(str[0] == 'U') 86 { 87 update(x,y,1); 88 } 89 } 90 } 91 return 0; 92 }