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

bnuoj 27411 堆或单调队列维护区间RMQ

时间:2015-05-01 18:42:10      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

很显然n方的复杂度过不了。

于是考虑优化最值的查询,可以考虑用堆或者单调队列来做。

堆:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 using namespace std;
 6 
 7 const int INF = 99999999;
 8 const int N = 32768;
 9 int a[N];
10 int n, l, u;
11 
12 struct Node
13 {
14     int l;
15     int s;
16     Node () {}
17     Node ( int _l, int _s )
18     {
19         l = _l;
20         s = _s;
21     }
22     bool operator < ( const Node & t ) const
23     {
24         return s < t.s;
25     }
26 };
27 
28 int solve()
29 {
30     priority_queue<Node> q;
31     int ans = INF;
32     for ( int i = l; i <= n; i++ )
33     {
34         q.push( Node ( i - l, a[i - l] ) );
35         while ( q.top().l + u < i ) q.pop();
36         int tmp = a[i] - q.top().s;
37         if ( tmp < ans ) ans = tmp;
38     }
39     return ans;
40 }
41 
42 int main()
43 {
44     while ( scanf("%d", &n), n )
45     {
46         scanf("%d%d", &l, &u);
47         a[0] = 0;
48         for ( int i = 1; i <= n; i++ )
49         {
50             scanf("%d", a + i);
51             a[i] += a[i - 1];
52         }
53         printf("%d\n", solve());
54     }
55     return 0;
56 }

单调队列:

bnuoj 27411 堆或单调队列维护区间RMQ

标签:

原文地址:http://www.cnblogs.com/huoxiayu/p/4470981.html

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