/* poj 2823
线段树 通用解法 没什么讲的
*/
#include<stdio.h>
#include<string.h>
const int N=1000011;
struct node
{
int l,r,min,max;
}tree[3*N];
int mmi[N],mma[N];
int a[N];
int k,n;
int max(int x,int y)
{
if(x>y) return x;
return y;
}
int min(int x,int y)
{
if(x<y) return x;
return y;
}
void build(int l,int r,int root)
{
tree[root].l=l;
tree[root].r=r;
if(l==r)
{
tree[root].min=tree[root].max=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,root*2);
build(mid+1,r,root*2+1);
tree[root].min=min(tree[2*root].min,tree[2*root+1].min);
tree[root].max=max(tree[2*root].max,tree[2*root+1].max);
}
void query(int l,int r,int &mmin,int &mmax,int root)
{
if(l==tree[root].l && r==tree[root].r)
{
mmin=tree[root].min;
mmax=tree[root].max;
return ;
}
int mid=(tree[root].l+tree[root].r)>>1;
if(mid>=r)
{
query(l,r,mmin,mmax,2*root);
}
else if(mid<l)
{
query(l,r,mmin,mmax,2*root+1);
}
else
{
int max2,min2;
query(l,mid,mmin,mmax,2*root);
query(mid+1,r,min2,max2,2*root+1);
mmin=min(mmin,min2);
mmax=max(mmax,max2);
}
}
void solve()
{
int mmin,mmax;
for(int i=1;i<=n-k+1;i++)
{
query(i,i+k-1,mmin,mmax,1);
mmi[i]= mmin;
mma[i]= mmax;
}
for(int i=1;i<=n-k+1;i++)
printf("%d ",mmi[i]);
printf("\n");
for(int i=1;i<=n-k+1;i++)
printf("%d ",mma[i]);
printf("\n");
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,n,1);
solve();
}
return 0;
}
poj 2823 Sliding Window
最新推荐文章于 2021-04-07 16:12:43 发布