题目大意:给定一个长度为N的数字序列,要求你求出每个长度为K的区间内的最小值与最大值。
#include<stdio.h>
#include<string.h>
#include<limits.h>
#define maxn 1000010
#define MAX INT_MAX
#define MIN INT_MIN
struct node
{
int l,r;//线段树区间
int mid;//线段树区间中间值
int min,max;//
}p[maxn<<2];//
int a[maxn][2];
int min,max;
void build(int id,int l,int r)
{
p[id].l=l;
p[id].r=r;
p[id].mid=(l+r)>>1;
p[id].min=MAX;
p[id].max=MIN;
if(l==r) return;
build(2*id,l,p[id].mid);
build(2*id+1,p[id].mid+1,r);
}
void update(int id,int l,int r,int t,int val)
{
if(l<=t&&t<=r){
if(p[id].min>val) p[id].min=val;
if(p[id].max<val) p[id].max=val;
}
if(l==r) return;
if(p[id].mid>=t) update(2*id,l,p[id].mid,t,val);
else update(id*2+1,p[id].mid+1,r,t,val);
}
void query(int id,int l,int r,int a,int b)
{
if(l==a&&r==b){
if(min>p[id].min) min=p[id].min;
if(max<p[id].max) max=p[id].max;
return;
}
if(l==r) return;
if(p[id].mid>=b) query(id*2,l,p[id].mid,a,b);
else if(p[id].mid<a) query(id*2+1,p[id].mid+1,r,a,b);
else{
query(id*2,l,p[id].mid,a,p[id].mid);
query(id*2+1,p[id].mid+1,r,p[id].mid+1,b);
}
}
int main()
{
int n,m,i,j,x;
scanf("%d%d",&n,&m);
build(1,1,n);
for(j=0;j<n;j++)
{
scanf("%d",&x);
update(1,1,n,j+1,x);
}
for(i=1;i<=n-m+1;i++)
{
min=MAX;
max=MIN;
query(1,1,n,i,i+m-1);
a[i][0]=min;
a[i][1]=max;
}
for(i=1;i<=n-m+1;i++)
printf("%d ",a[i][0]);
printf("\n");
for(i=1;i<=n-m+1;i++)
printf("%d ",a[i][1]);
printf("\n");
return 0;
}