Pagini recente » Cod sursa (job #457399) | Cod sursa (job #588421) | Cod sursa (job #1019833) | Cod sursa (job #2114506) | Cod sursa (job #825217)
Cod sursa(job #825217)
#include<fstream>
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
typedef struct { long long val; long long, poz; } str;
str heap[5000001];
long long n, i, k, s=0, x;
long long father(long long x)
{
return x/2;
}
long long left_son(long long x)
{
return x*2;
}
long long right_son(long long x)
{
return x*2+1;
}
long long maxim(str heap[])
{
return heap[1].val;
}
long long max(str heap[], long long a, long long b)
{
if(heap[a].val > heap[b].val)
return a;
return b;
}
void sift(str heap[], long long n, long long x)
{
long long aux1;
str aux2;
while( ( left_son(x) <= n && heap[x].val < heap[left_son(x)].val ) || ( right_son(x)<=n && heap[x].val < heap[right_son(x)].val ) )
{
if(right_son(x)<=n)
aux1=max( heap, left_son(x), right_son(x) );
else
aux1=left_son(x);
aux2=heap[aux1];
heap[aux1]=heap[x];
heap[x]=aux2;
x=aux1;
}
}
void percolate( str heap[], long long n, long long x )
{
str aux = heap[x];
while( (x > 1) && (aux.val > heap[father(x)].val) )
{
heap[x] = heap[father(x)];
x = father(x);
}
heap[x]=aux;
}
void build_heap(str heap[], long long n)
{
for (long long i = n / 2; i > 0; --i)
{
sift(heap, n, i);
}
}
void cut( str heap[], long long &n, long long x)
{
if( heap[x].val > heap[n].val)
{
heap[x]=heap[n];
n--;
percolate(heap, n, x);
}
else
{
heap[x]=heap[n];
n--;
sift(heap, n, x);
}
}
void insert(str heap[], long long &n, long long va)
{
heap[++n].val=va;
heap[n].poz=n;
percolate(heap, n, n);
}
void heapsort(str heap[], long long n)
{
str aux;
build_heap(heap, n);
for(i=n; i>=2; --i)
{
aux=heap[1];
heap[1]=heap[i];
heap[i]=aux;
sift(heap, i-1, 1);
}
}
void printf(str heap[], long long n)
{
long long i;
for(i=1; i<=n; ++i)
g<<heap[i].val<<" ";
g<<"\n";
}
void printf2(str heap[], long long n)
{
long long i;
for(i=1; i<=n; ++i)
g<<heap[i].poz<<" ";
g<<"\n";
}
int main()
{
f>>n>>k;
long long naux=n;
for( i=1; i <= k; ++i)
{
heap[i].poz=i;
f>>heap[i].val;
}
heapsort(heap, k);
for( i = k+1; i <= naux; i++)
{
s+=heap[1].val;
//printf(heap,i-1);
//g<<s<<"\n";
insert(heap, n, x);
if( heap[1].poz == (i-k) )
cut(heap, n, 1);
}
g<<s;
return 0;
}