Cod sursa(job #824812)
Utilizator | Data | 26 noiembrie 2012 22:44:37 | |
---|---|---|---|
Problema | Deque | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.49 kb |
#include <stdio.h>
using namespace std;
long h=0,n,k,v[5000001],H[5000001];
long long s=0;
int minim()
{
// printf("%ld",H[1]);
return H[1];
}
void insert()
{
long k,aux;
k=h;
while(k>1 && H[k]<H[k/2])
{
aux=H[k];
H[k]=H[k/2];
H[k/2]=aux;
aux=v[k];
v[k]=v[k/2];
v[k/2]=aux;
k=k/2;
}
}
int pozminima(long a, long b)
{
if(H[a]<H[b]) return a;
else return b;
}
void down(long x)
{
long aux,g,m;
while(1)
{
if (2*x+1<=h){
g=pozminima(2*x,2*x+1);
m=H[g];
if (H[g]<=H[x]) {
aux=H[x];
H[x]=H[g];
H[g]=aux;
aux=v[x];
v[x]=v[g];
v[g]=aux;
}
else break;
}
else if(2*x<=h) {
g=2*x;
m=H[g];
if(H[g]<H[x]) {
aux=H[x];
H[x]=H[g];
H[g]=aux;
aux=v[x];
v[x]=v[g];
v[g]=aux;
}
else break;
}
else break;
x=g;
}
}
void eliminare( long a)
{
while (v[1]<a)
{
H[1]=H[h];
h--;
down(1);
}
}
int main()
{
long i;
FILE*f,*g;
f=fopen("deque.in","r");
g=fopen("deque.out","w");
fscanf(f,"%ld%ld",&n,&k);
for(i=1;i<k;i++)
{
++h;
fscanf(f,"%ld",&H[h]);
// printf("*%d*\n",H[h]);
v[h]=i;
insert();
}
for(i=k;i<=n;i++)
{
++h;
fscanf(f,"%ld",&H[h]);
// printf("*%d*\n",H[h]);
v[h]=i;
insert();
eliminare(i-k+1);
s=s+minim();
}
fprintf(g,"%lld",s);
return 0;
}