很慢的线段树,不过可以作为最简单的模板。代码风格学的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));
}