首页 > 代码库 > [HDU1754]I Hate It线段树裸题
[HDU1754]I Hate It线段树裸题
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线段树裸题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。