http://poj.org/problem?id=2823
裸的单调队列.
注意: 队列里存的是下标, 就不要把他当做值用- -
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; inline int Rint() { int x; scanf("%d", &x); return x; } inline int max(int x, int y) { return (x>y)? x: y; } inline int min(int x, int y) { return (x<y)? x: y; } #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define FORD(i,a,b) for(int i=(a);i>=(b);i--) #define REP(x) for(int i=0; i<(x); i++) typedef long long int64; #define INF (1<<30) const double eps = 1e-8; #define bug(s) cout<<#s<<"="<<s<<" " // 裸的单调队列. // d[i] = min{ a[j] | j=[i-K+1, i], j>=0 } #define MAXN 1000002 int q[MAXN]; //min int f[MAXN]; int front, tail; int q2[MAXN]; //max int front2, tail2; int minx[MAXN]; int maxx[MAXN]; int main() { int n = Rint(); int K= Rint(); front = tail = 0; front2 = tail2 = 0; FOR(i, 1, n) //online { f[i] = Rint(); // 把 i 丢进队列 while(front<tail && f[q[tail-1]]>f[i]) tail--; q[tail++] = i; while(front2<tail2 && f[q2[tail2-1]]<f[i]) tail2--; q2[tail2++] = i; //bug(q[front]);bug(f[q[front]])<<endl; if(i>=K) // 取front 作为 最值 { int low = i-K+1; while(q[front]<low) front++; minx[i] = f[q[front]]; while(q2[front2]<low) front2++; maxx[i] = f[q2[front2]]; } } FOR(i, K, n) { printf("%d", minx[i]); if(i!=n) putchar(' '); } putchar('\n'); FOR(i, K, n) { printf("%d", maxx[i]); if(i!=n) putchar(' '); } putchar('\n'); }