码迷,mamicode.com
首页 > 其他好文 > 详细

hicocoder1068 区间最值询问(线段树)

时间:2015-02-21 15:26:08      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://hihocoder.com/problemset/problem/1068

我的代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 #define MAXN 1000005
 8 
 9 int w[MAXN];
10 
11 struct segNode
12 {
13     int left, right, minw;
14 };
15 
16 struct segTree
17 {
18     segNode t[4*MAXN];
19     void build(int i, int l, int r)
20     {
21         t[i].left = l;
22         t[i].right = r;
23         if(l==r)    t[i].minw = w[l];
24         else
25         {
26             int m = (l+r)/2;
27             build(2*i, l, m);
28             build(2*i+1, m+1, r);
29             t[i].minw = min(t[2*i].minw, t[2*i+1].minw);
30         }
31     }
32     int query(int i, int l, int r)
33     {
34         if(t[i].left==l&&t[i].right==r) return t[i].minw;
35         int m = (t[i].left+t[i].right)/2;
36         if(r<=m) return query(2*i, l, r);
37         if(l>m) return query(2*i+1, l, r);
38         return min(query(2*i, l, m), query(2*i+1, m+1, r));
39     }
40 }segtree;
41 
42 int main()
43 {
44     int n, q;
45     //while(cin>>n)
46     while(scanf("%d", &n)!=EOF)
47     {
48         for(int i=1; i<=n; ++i)
49             //cin>>w[i];
50             scanf("%d", &w[i]);
51         segtree.build(1, 1, n);
52         //cin>>q;
53         scanf("%d", &q);
54         while(q--)
55         {
56             int l, r;
57             //cin>>l>>r;
58             scanf("%d%d", &l, &r);
59             //cout<<segtree.query(1, l, r)<<endl;
60             printf("%d\n", segtree.query(1, l, r));
61         }
62     }
63     return 0;
64 }

需要注意的是:涉及到频繁的输入输出,最好用C语言的标准输入输出而不要用C++的流式输入输出,否则提交很可能会超时。(我一开始用cin, cout就超时了T^T)。

hicocoder1068 区间最值询问(线段树)

标签:

原文地址:http://www.cnblogs.com/pczhou/p/4297007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!