题目链接:http://poj.org/problem?id=2823
这题要求最值,因而想到用堆,又因为要保留的仅仅是在窗口以内的数据,所以可以将数据的下标放入队列中,当堆顶元素超出窗口时将其弹出(下标超标),以满足题目要求。
代码如下:
内存:
47124kB
时间:
1524ms
语言:
G++
#include <iostream>
#include <queue>
#include <vector>
const int MAXN = 1000050;
using std::priority_queue;
using std::vector;
int arr[MAXN], MAX[MAXN], MIN[MAXN], count;
struct greater{
public:
bool operator()(const int one, const int two)
{
return arr[one] > arr[two];
}
};
struct less{
bool operator()(const int one, const int two)
{
return arr[one] < arr[two];
}
};
priority_queue< int, vector<int>, less > max_que;
priority_queue< int, vector<int>, greater > min_que;
void
init(int k)
{
for(int i = 0; i < k; ++i)
{
max_que.push(i);
min_que.push(i);
}
MAX[count] = arr[max_que.top()];
MIN[count++] = arr[min_que.top()];
}
void print(int arr[])
{
for(int i = 0; i < count ; ++i)
printf("%d ", arr[i]);
printf("\n");
}
int
main()
{
int n, k;
scanf("%d %d", &n, &k);
if(k > n) k = n;
for(int i = 0; i < n; ++i)
scanf("%d", &arr[i]);
init(k);
for(int i = k; i < n; ++i)
{
max_que.push(i);
min_que.push(i);
while(i - max_que.top() >= k) {
max_que.pop();
}
while(i - min_que.top() >= k) {
min_que.pop();
}
MIN[count] = arr[min_que.top()];
MAX[count++] = arr[max_que.top()];
}
print(MIN);
print(MAX);
return 0;
}