哈理工oj 1189-区间最大值

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1189

这道题是用线段树去求区间最大值的一道题,树状数组对于这个数据量已经显得无能为力了,这也说明了树状数组和线段树分别适合的不同的题

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 100005
 4 int max(int a,int b)
 5 {
 6     return a>b?a:b;
 7 }
 8 int n;
 9 struct node
10 {
11     int l;
12     int r;
13     int max;
14 };
15 node tree[4*N];
16 int val[N];
17 void build(int l,int r,int i)
18 {
19     tree[i].l=l;
20     tree[i].r=r;
21     if(l==r)
22     {
23         tree[i].max=val[l];
24         return;
25     }
26     int mid=(l+r)>>1;
27     build(l,mid,i<<1);
28     build(mid+1,r,i<<1|1);
29     tree[i].max=max(tree[i<<1].max,tree[i<<1|1].max);
30 }
31 int query(int l,int r,int i)
32 {
33     if(tree[i].l==l&&tree[i].r==r)
34     {
35         return tree[i].max;
36     }
37     int mid=(tree[i].l+tree[i].r)>>1;
38     int maxa=0;
39     if(r<=mid)
40     maxa=query(l,r,i<<1);
41     else if(l>mid)
42     maxa=query(l,r,i<<1|1);
43     else
44     maxa=max(query(l,mid,i<<1),query(mid+1,r,i<<1|1));
45     return maxa;
46 }
47 int main()
48 {
49     int i;
50     int q;
51     int s,t;
52     int icase=1;
53     while(scanf("%d",&n)!=EOF)
54     {
55         for(i=1;i<=n;i++)
56         scanf("%d",&val[i]);
57         build(1,n,1);
58         scanf("%d",&q);
59         printf("Case %d:\n",icase++);
60         while(q--)
61         {
62             scanf("%d%d",&s,&t);
63             printf("%d\n",query(s,t,1));
64         }
65     }
66     return 0;
67 }

 

posted @ 2012-04-20 22:10  zhenhai  阅读(219)  评论(0)    收藏  举报