POJ2823 Sliding Window

方法:建两个堆,同时维护一个大根堆和一个小根堆
用一对指针就行卡位
弹出的时候如果在这个区间就记录下来,如果不在区间内就扔掉。

#include < iostream >
using   namespace  std;
int  a[ 1000010 ];
int  minout[ 1000010 ],maxout[ 1000010 ];
int  n,k;
struct  node{
    
int  key;
    
int  pla;
};    
struct  heap // 堆 
{
    
int  size;
    
struct  node elem[ 2000010 ];
    }minh,maxh;

void  insertmin( int  x, int  p) 
{
     
int  i =   ++ minh.size;
     
while (minh.elem[i / 2 ].key  >  x)
     {
         minh.elem[i]
= minh.elem[i / 2 ];
        i 
/= 2 ;                     
    }
    minh.elem[i].key
= x;
    minh.elem[i].pla
= p;
}

void  deletemin()
{
     
int  i,child,last,place;
     last
= minh.elem[minh.size].key;
     place
= minh.elem[minh.size].pla;
     minh.size
-- ;
     
for (i = 1 ;i * 2   <=  minh.size;i  =  child)
     {
        child
= 2 * i;
        
if (child  !=  minh.size  &&  minh.elem[child + 1 ].key  <  minh.elem[child].key )
            child
++ ;
        
if ( last  >  minh.elem[child].key )
            minh.elem[i] 
=  minh.elem[child];
        
else   break ;    
        }
    minh.elem[i].key
= last;
    minh.elem[i].pla
= place;
}

void  insertmax( int  x, int  p) 
{
     
int  i =   ++ maxh.size;
     
while (maxh.elem[i / 2 ].key  <  x)
     {
         maxh.elem[i]
= maxh.elem[i / 2 ];
        i 
/= 2 ;                     
    }
    maxh.elem[i].key
= x;
    maxh.elem[i].pla
= p;
}

void  deletemax()
{
     
int  i,child,last,place;
     last
= maxh.elem[maxh.size].key;
     place
= maxh.elem[maxh.size].pla;
     maxh.size
-- ;
     
for (i = 1 ;i * 2   <=  maxh.size;i  =  child)
     {
        child
= 2 * i;
        
if (child  !=  maxh.size  &&  maxh.elem[child + 1 ].key  >  maxh.elem[child].key ) //
            child ++ ;
        
if ( last  <  maxh.elem[child].key ) //
            maxh.elem[i]  =  maxh.elem[child];
        
else   break ;    
        }
    maxh.elem[i].key
= last;
    maxh.elem[i].pla
= place;
}
void  cal()
{
    
int  i;
    minh.size
= 0 ;
    minh.elem[
0 ].key =- INT_MAX;
    maxh.size
= 0 ;
    maxh.elem[
0 ].key = INT_MAX;
    
for (i = 1 ;i <= k;i ++ )
        {
            insertmin(a[i],i);
            insertmax(a[i],i);
            }
    
int  p1 = 1 ,p2 = k;
    
while (p2 <= n)
    {
        
while (minh.elem[ 1 ].pla  <  p1  ||  minh.elem[ 1 ].pla > p2)
            deletemin();
        
while (maxh.elem[ 1 ].pla  <  p1  ||  maxh.elem[ 1 ].pla > p2)
            deletemax();
        minout[p1]
= minh.elem[ 1 ].key;
        maxout[p1]
= maxh.elem[ 1 ].key;
        p1
++ ;
        p2
++ ;
        insertmin(a[p2],p2);
        insertmax(a[p2],p2);
        }
}
int  main()
{
    
int  i;
    scanf(
" %d%d " , & n, & k);
    
for (i = 1 ;i <= n;i ++ )
        scanf(
" %d " , & a[i]);
    cal();
    
for (i = 1 ;i <= n - k;i ++ )
        printf(
" %d  " ,minout[i]);
    printf(
" %d\n " ,minout[n - k + 1 ]);
    
for (i = 1 ;i <= n - k;i ++ )
        printf(
" %d  " ,maxout[i]);
    printf(
" %d\n " ,maxout[n - k + 1 ]);
    }

你可能感兴趣的:(POJ2823 Sliding Window)