Pagini recente » Cod sursa (job #2068393) | Cod sursa (job #2035294) | Cod sursa (job #525873) | Cod sursa (job #322401) | Cod sursa (job #1519838)
#include <cstdio>
using namespace std;
FILE *f = fopen ( "deque.in" , "r" ) , *g = fopen ( "deque.out" , "w" );
const int MAXK = 5000005 , MAXN = 5000005;
int N , K , i , father , index , son , heap [ MAXK ] , value [ MAXN ] , indexed [ MAXN ] , aux , left , right;
long long SUM;
void heapify ( int index )
{
father = index / 2;
while ( value [ heap [ index ] ] < value [ heap [ father ] ] && father )
{
aux = heap [ index ] , heap [ index ] = heap [ father ] , heap [ father ] = aux;
indexed [ heap [ index ] ] = index;
indexed [ heap [ father ] ] = father;
index /= 2 , father = index / 2;
}
}
void shiftdown ( int index )
{
//find the minimum
son = -1;
while ( index != son )
{
left = index * 2 , right = left + 1;
son = index;
if ( left <= K && value [ heap [ left ] ] < value [ heap [ index ] ] )
index = left;
if ( right <= K && value [ heap [ right ] ] < value [ heap [ index ] ] )
index = right;
aux = heap [ index ] , heap [ index ] = heap [ son ] , heap [ son ] = aux;
indexed [ heap [ index ] ] = index;
indexed [ heap [ son ] ] = son;
}
}
void eliminate ( int index )
{
heap [ index ] = heap [ K ] , K --;
shiftdown ( index );
}
void addToHeap ( int i , int index )
{
eliminate ( indexed [ index ] ); //eliminate the node at position index
K ++ , heap [ K ] = i , heapify ( K ); //add number in the heap
}
void addToSum()
{
SUM += value [ heap [ 1 ] ];
}
void build_heap()
{
for ( i = K / 2 ; i > 0 ; i -- )
shiftdown ( i );
}
void read()
{
fscanf ( f , "%d %d" , &N , &K );
for ( i = 1 ; i <= K ; indexed [ i ] = i , heap [ i ] = i , i ++ )
fscanf ( f , "%d" , &value [ i ] );
build_heap();
addToSum(); //add minim to sum
for ( i = K + 1 ; i <= N ; i ++ )
{
indexed [ i ] = i;
fscanf ( f , "%d" , &value [ i ] );
addToHeap ( i , i - K );
addToSum();
}
}
void print()
{
fprintf ( g , "%lld\n" , SUM );
}
int main()
{
read();
print();
return 0;
}