思路
优先队列
符号的重写
C++ 代码
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7fffffff
using namespace std;
const int maxn = 1e5+5;
struct num{
int value,index; // 值以及它的下标
bool operator < (const num &p) const{ // 重写小于号
return value < p.value;
}
bool operator > (const num &p) const{ // 重写大于号
return value > p.value;
}
}a;
priority_queue <num> da; // 降序排序 (大的在队首)
priority_queue <num,vector<num>,greater<num> > xiao; // 升序排序 (小的在队首)
int main(){
ios::sync_with_stdio(false);
//freopen("1.in.txt","r",stdin);
int n,m;
cin >> n >> m;
vector <int> V[2]; // 用于保存最后的答案
for(int i = 0;i < n;i++){
cin >> a.value;
a.index = i;
da.push(a),xiao.push(a); // 分别放入两个队列中
if(i >= m-1){
while(i - da.top().index >= m) da.pop(); // 如果当前的队首 是很久之前放进来的 pop掉
while(i - xiao.top().index >= m) xiao.pop(); // 同理
V[0].push_back(da.top().value); // 当前的队首即为我们所要的对应i的答案
V[1].push_back(xiao.top().value); // 同理
}
}
for(int i = 0;i < V[1].size();i++) cout << V[1][i] << ' '; // 输出最小值
cout << endl;
for(int i = 0;i < V[0].size();i++) cout << V[0][i] << ' '; // 输出最大值
return 0;
}