单调队列:队列里的元素是单调的。复杂度O(2n)
洛谷 P1440 链接
题意:一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。
题解:单调队列模板题,入队时弹出,出队时判断。这题用j解除流绑定的cin还是会超时...
#include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i=(a); i< (b); i++) #define _rep(i,a,b) for(int i=(a); i<=(b); i++) typedef long long ll; const int MAXN=2e6+5; struct Que{ int idx, val; }q[MAXN]; int a[MAXN]; int main() { //ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k; scanf("%d%d", &n, &k); _rep(i, 1, n) scanf("%d", &a[i]); int front=1, back=0; _rep(i, 1, n) { if(front>back) printf("0\n"); else { while(q[front].idx+k<i) front++; printf("%d\n", q[front].val); } while(back>=front && q[back].val>=a[i]) back--; q[++back].val=a[i]; q[back].idx=i; } return 0; }