poj 2823 Sliding Window

来源:互联网 发布:如何在页面注入js脚本 编辑:程序博客网 时间:2024/05/16 15:59
/*  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;    }