Monotonous queue board questions
First, the basic
Monotone queue:
Special deque, the internal elements. Divided maximum queue (monotonically increasing) and the minimum queue (monotonically decreasing) in two
Second, the application
In this problem: most monotonous queue optimization of dynamic programming problems and fixed-length continuous subinterval most value problem
#include<bits/stdc++.h> using namespace std; inline int read() { int sum = 0,p = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') p = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { (sum *= 10) += ch - '0'; ch = getchar(); } return sum * p; } const int N = 1e6 + 5; int n,k,head,tail; int a[N],fn[N],fx[N],num[N],q[N]; void dpmin() { head = 1,tail = 0; for(int i = 1;i <= n;i++) { while(num[head] < i - k + 1 && head <= tail) head++; while(a[i] <= q[tail] && head <= tail) tail--; num[++tail] = i; q[tail] = a[i]; fn[i] = q[head]; } } void dpmax() { head = 1,tail = 0; for(int i = 1;i <= n;i++) { while(num[head] < i - k + 1 && head <= tail) head++; while(a[i] >= q[tail] && head <= tail) tail--; num[++tail] = i; q[tail] = a[i]; fx[i] = q[head]; } } int main() { n = read(),k = read(); for(int i = 1;i <= n;i++) a[i] = read(); dpmin(); dpmax(); for(int i = k;i <= n;i++) printf("%d ",fn[i]); printf("\n"); for(int i = k;i <= n;i++) printf("%d ",fx[i]); return 0; }