Magnetic Storms

http://acm.timus.ru/problem.aspx?space=1&num=1126

简单的线段树求区间最值

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N=100002;
 6 int a[N],ans ;
 7 struct node
 8 {
 9     int l,r,Max;
10 } tree[N*4];
11 void build(int t,int l,int r)
12 {
13     tree[t].l = l;
14     tree[t].r = r;
15     if (l==r)
16     {
17         tree[t].Max = a[r];
18         return ;
19     }
20     int mid = (l+r)>>1;
21     build(t<<1,l,mid);
22     build(t<<1|1,mid+1,r);
23     tree[t].Max = max(tree[t<<1].Max,tree[t<<1|1].Max);
24 }
25 void Query(int t,int l,int r)
26 {
27     if (l <= tree[t].l && r>= tree[t].r)
28     {
29         ans = max(ans,tree[t].Max);
30         return ;
31     }
32     int mid = (tree[t].l+tree[t].r)>>1;
33     if (r <= mid)
34         Query(t<<1,l,r);
35     else if (l > mid)
36         Query(t<<1|1,l,r);
37     else
38     {
39         Query(t<<1,l,mid);
40         Query(t<<1|1,mid+1,r);
41     }
42 }
43 int main()
44 {
45     int m,n = 1,x;
46     scanf("%d",&m);
47     while(1)
48     {
49         scanf("%d",&x);
50         if (x == -1)
51             break;
52         a[n++] = x;
53     }
54     build(1,1,n);
55     for (int i = 1; i <= n-m; i++)
56     {
57         ans = 0;
58         Query(1,i,m+i-1);
59         printf("%d\n",ans);
60     }
61     return 0;
62 }
View Code

 

posted @ 2014-04-01 19:10  N_ll  阅读(193)  评论(0编辑  收藏  举报