Cod sursa(job #633627)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 14 noiembrie 2011 11:58:51
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_N = 5000005;
const int MAX_HEAP_SIZE = 8388610;

int  heap[MAX_N],p[MAX_N],lungimeHeap;
int n,kk;
int a[MAX_N];
long long minim=0;

void coboaraInHeap(int k)
{
	int fiu;
	do
	{
		fiu = 0;
		if(2*k<=lungimeHeap)
		{
			fiu = 2*k;
			if(2*k+1 <= lungimeHeap && a[heap[2*k+1]]<a[heap[2*k]])
				fiu = 2*k+1;
		}
		if(a[heap[fiu]] >= a[heap[k]])
			fiu = 0;
		if(fiu)
		{
			int aux=heap[fiu];
			heap[fiu]=heap[k];
			heap[k]=aux;
			p[heap[k]]=k;
			p[heap[fiu]]=fiu;
			k = fiu;
		}
	}while(fiu);
}

void urcaInHeap(int k)
{
	int val = heap[k];
	while(k>1 && a[val]<a[heap[k/2]])
	{
		heap[k]=heap[k/2];
		p[heap[k]]=k;
		k/=2;
	}
	heap[k]=val;
	p[heap[k]] = k;
}

void inserare(long long pozInA)
{
	lungimeHeap++;
	heap[lungimeHeap]= pozInA;
	p[heap[lungimeHeap]] = lungimeHeap;
	urcaInHeap(lungimeHeap);
}

void stergere(long long k)
{
	heap[k]=heap[lungimeHeap];
	p[heap[k]] = k;
	lungimeHeap--;
	if(k>1 && a[heap[k]]<a[heap[k/2]])
		urcaInHeap(k);
	else 
		coboaraInHeap(k);
}

void citire()
{
	scanf("%d %d",&n,&kk);
	for(long long i=1;i<=n;i++)
		scanf("%d",&a[i]);
}

void afisare()
{
	//for(long long i=1;i<=n;i++)
		//prlong longf("%d ",a[i]);
	printf("%lld\n",minim);
}

void rezolvare()
{
	for(int i=1;i<=kk;i++)
		inserare(i);
	//printf("%d ",a[heap[1]]);
	minim += a[heap[1]];
//	for(int j=1;j<=lungimeHeap;j++)
	//	printf("%d ",heap[j]);
	//printf("\n");
	for(int i=1;i<=n-kk;i++)
	{
		stergere(p[i]);
		inserare(i+kk);
		//printf("%d ",a[heap[1]]);
		minim+=a[heap[1]];
		//for(int j=1;j<=lungimeHeap;j++)
			//printf("%d ",heap[j]);
		//printf("\n");
	}
	//printf("\n");	
}

int main()
{
	freopen("deque.in","rt",stdin);
	freopen("deque.out","wt",stdout);
	citire();
	rezolvare();
	afisare();
	return 0;
}