1. 程式人生 > >[HDU1754]I Hate It線段樹裸題

[HDU1754]I Hate It線段樹裸題

getc har namespace getch div names tchar c++ 定義

http://acm.hdu.edu.cn/showproblem.php?pid=1754

解題關鍵:剛開始死活超時,最後發現竟然是ch,和t1、t2每次循環都定義的鍋,以後養成建全局變量的習慣。

註意背模板時,find時最後無賦值

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct node{
 5     int left,right,max;
 6 }tree[800002];
 7 int num[200002];
 8 char ch;
9 int t1,t2; 10 int build(int root,int left,int right){ 11 tree[root].left=left; 12 tree[root].right=right; 13 if(left==right) return tree[root].max=num[left]; 14 15 int a,b,mid; 16 mid=(left+right)/2; 17 a=build(2*root,left,mid); 18 b=build(2*root+1,mid+1,right);
19 return tree[root].max=max(a,b); 20 } 21 22 int find(int root,int left,int right){ 23 if(right<tree[root].left||left>tree[root].right) return 0; 24 if(left<=tree[root].left&&tree[root].right<=right) return tree[root].max; 25 26 int a,b; 27 a=find(2
*root,left,right); 28 b=find(2*root+1,left,right); 29 return max(a,b);//find時不能賦值 30 } 31 32 int update(int root,int pos,int val){ 33 if(pos<tree[root].left||pos>tree[root].right) return tree[root].max; 34 if(pos==tree[root].left&&pos==tree[root].right) return tree[root].max=val; 35 36 int a,b; 37 a=update(2*root,pos,val); 38 b=update(2*root+1,pos,val); 39 return tree[root].max=max(a,b); 40 } 41 int n,m; 42 int main(){ 43 while(scanf("%d%d",&n,&m)!=EOF){ 44 memset(num,0,sizeof num); 45 memset(tree,0,sizeof tree); 46 for(int i=1;i<=n;i++){ 47 scanf("%d",num+i); 48 } 49 build(1,1,n); 50 for(int i=0;i<m;i++){ 51 getchar(); 52 scanf("%c%d%d",&ch,&t1,&t2); 53 if(ch==Q){ 54 int res=find(1,t1,t2); 55 printf("%d\n",res); 56 } 57 else{ 58 update(1,t1,t2); 59 } 60 } 61 } 62 63 }

[HDU1754]I Hate It線段樹裸題