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

 

转载于:https://www.cnblogs.com/lahblogs/p/3639018.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值