单调队列
单调队列是一个单调的状态(递增,或者递减)
所以需要维护这么一个状态
固定 k 区间的单调 队列,求 最小值,如果 两个元素 A B ,如果 A 的 下标 比 B 小,但是 A 的 值 比 B 大,那么在固定的 区间里面,A的值是没有意义的,所以应该把 A删除……
删除队尾,使新加入的元素保持队列的单调性。队首元素是最值
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <deque> using namespace std; const int MAXN = 10e6+10; int arr[MAXN]; int main(){ // freopen("input.txt","r",stdin); int n,k; while(~scanf("%d%d",&n,&k)){ for(int i=0;i<n;i++){ scanf("%d",&arr[i]); } deque<int>dq; //最小 for(int i=0;i<k-1;i++){ while(!dq.empty() && dq.back()>arr[i]){ dq.pop_back(); } dq.push_back(arr[i]); } for(int i=k-1;i<n;i++){ while(!dq.empty() && dq.back()>arr[i]){ dq.pop_back(); } dq.push_back(arr[i]); if(i==k-1){ printf("%d",dq.front()); }else{ printf(" %d",dq.front()); } if(arr[i-k+1] == dq.front()){ dq.pop_front(); } } while(!dq.empty()){ dq.pop_back(); } printf("\n"); for(int i=0;i<k-1;i++){ while(!dq.empty() && dq.back()<arr[i]){ dq.pop_back(); } dq.push_back(arr[i]); } for(int i=k-1;i<n;i++){ while(!dq.empty() && dq.back()<arr[i]){ dq.pop_back(); } dq.push_back(arr[i]); if(i==k-1){ printf("%d",dq.front()); }else{ printf(" %d",dq.front()); } if(arr[i-k+1] == dq.front()){ dq.pop_front(); } } printf("\n"); } return 0; }
C++
删除队尾时候用数组,二分会好一点 = =
时间: 2024-10-26 22:41:40