很显然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 }
单调队列:
时间: 2024-12-15 07:09:44