POJ 2823
很慢的线段树,不过可以作为最简单的模板。代码风格学的Not Only Success。C++过,G++不过。
#include <cstdio> #include <climits> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int MAX = 1000005; int minarray[MAX<<2]; int maxarray[MAX<<2]; int n,k; int min(int a,int b) { return a>b?b:a; } int max(int a,int b) { return a>b?a:b; } void build(int l,int r,int rt) { if(l == r) { int temp; scanf("%d",&temp); minarray[rt] = temp; maxarray[rt] = temp; return; } int m = (l+r)>>1; build(lson); build(rson); minarray[rt] = min(minarray[rt<<1], minarray[rt<<1|1]); maxarray[rt] = max(maxarray[rt<<1], maxarray[rt<<1|1]); } int querymin(int L,int R, int l,int r,int rt) { if(L <= l && r <= R) { return minarray[rt]; } int m = (l+r)>>1; int ans = INT_MAX; if(L <= m) ans = min(ans, querymin(L, R, lson)); if(m < R) ans = min(ans, querymin(L, R, rson)); return ans; } int querymax(int L,int R, int l,int r,int rt) { if(L <= l && r <= R) { return maxarray[rt]; } int m = (l+r)>>1; int ans = INT_MIN; if(L <= m) ans = max(ans, querymax(L, R, lson)); if(m < R) ans = max(ans, querymax(L, R, rson)); return ans; } int main() { scanf("%d %d", &n, &k); build(1,n,1); for(int i = 1; i <= n-k; i++) { printf("%d ", querymin(i, i+k-1, 1, n, 1)); } printf("%d\n", querymin(n-k+1, n, 1, n, 1)); for(int i = 1; i <= n-k; i++) { printf("%d ", querymax(i, i+k-1, 1, n, 1)); } printf("%d\n", querymax(n-k+1, n, 1, n, 1)); }