标签:inf == div define stream strong tor algo main
题解:从前往后,维护一个从栈底到栈顶递增的栈,那么每个区间的最小值就是栈底。从后往前,维护一个从栈顶到栈底递增的栈,那么每个区间的最大值就是栈底。
//#include<bits/stdc++.h> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bitset> #include<vector> #include<queue> #include<map> #include<string> #include<stack> #define ll long long #define P pair<int, int> #define PP pair<int,pair<int, int>> #define pb push_back #define pp pop_back #define lson root << 1 #define INF (int)2e9 + 7 #define rson root << 1 | 1 #define LINF (unsigned long long int)1e18 #define mem(arry, in) memset(arry, in, sizeof(arry)) using namespace std; const int N = 1e6 + 10; int n, k; int a[N], b[N], c[N], Max[N], Min[N]; void solve() { int l = 0, r = 0; for(int i = n; i >= 1; i--) { while(r > l && b[l] > i + k - 1) l++; while(r > l && a[b[r - 1]] <= a[i]) r--; b[r++] = i; if(i > n - k + 1) continue; Max[i] = a[b[l]]; } for(int i = 1; i <= n; i++) { while(r > l && a[c[r - 1]] >= a[i]) r--; c[r++] = i; if(i < k) continue; while(r > l && c[l] < i - k + 1) l++; Min[i] = a[c[l]]; } } int main() { scanf("%d %d", &n, &k); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); solve(); for(int i = k; i <= n; i++) printf("%d%c", Min[i], (i == n ? ‘\n‘ : ‘ ‘)); for(int i = 1; i <= n - k + 1; i++) printf("%d%c", Max[i], (i == n - k + 1 ? ‘\n‘ : ‘ ‘)); return 0; }
标签:inf == div define stream strong tor algo main
原文地址:https://www.cnblogs.com/zgglj-com/p/9395427.html