HDU-1754-I Hate It
HDU-1754-I Hate It
http://acm.hdu.edu.cn/showproblem.php?pid=1754
查询区间的最大值,并可以更新
线段树即可,如图为区间[1,5]的线段树
#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 200005 int num[N]; struct cam { int x; //起点 int y; //终点 int max; //区间的最大值 }list[N*4]; int Max(int x,int y) { return x>y?x:y; } int build(int k,int x,int y) //建树 { int mid; list[k].x=x; list[k].y=y; if(list[k].x==list[k].y) { list[k].max=num[x]; return list[k].max; } mid=(x+y)/2; list[k].max=Max(build(k<<1,x,mid),build(k<<1|1,mid+1,y)); return list[k].max; } int find(int k,int x,int y) //寻找x到y区间中的最大值 { int mid; if(list[k].x==x&&list[k].y==y) return list[k].max; mid=(list[k].x+list[k].y)/2; if(x>mid) return find(k<<1|1,x,y); else if(y<=mid) return find(k<<1,x,y); else return Max(find(k<<1,x,mid),find(k<<1|1,mid+1,y)); } void update(int k,int x,int y) //更新 { int mid; if(list[k].x==x&&list[k].y==x) { list[k].max=y; return; } mid=(list[k].x+list[k].y)/2; if(x<=mid) update(k<<1,x,y); else update(k<<1|1,x,y); list[k].max=Max(list[k<<1].max,list[k<<1|1].max); } int main() { int i,n,m; int a,b; char c; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&num[i]); build(1,1,n); while(m--) { getchar(); scanf("%c %d %d",&c,&a,&b); if(c=='Q') printf("%d\n",find(1,a,b)); else { num[a]=b; update(1,a,b); } } } return 0; }
posted on 2012-07-18 21:52 java课程设计例子 阅读(128) 评论(0) 编辑 收藏 举报