Pagini recente » Cod sursa (job #85833) | Cod sursa (job #93533) | Cod sursa (job #764340) | Cod sursa (job #1373441) | Cod sursa (job #1052640)
//
// main.c
// deque
//
// Created by Alexandru Bâgu on 12/10/13.
// Copyright (c) 2013 Alexandru Bâgu. All rights reserved.
//
#include <stdio.h>
#include <fstream>
using namespace std;
typedef struct node {
int key, value;
} hnode;
typedef hnode* HEAP;
int n, KEY_ID;
int swap(hnode* h, hnode* h2)
{
hnode aux = *h;
*h = *h2;
*h2 = aux;
return 0;
}
int up(HEAP h, int p)
{
if(p > 1 && h[p].value < h[p/2].value)
{
swap(h + p, h + p / 2);
up(h, p / 2);
}
return 0;
}
int down(HEAP h, int p)
{
if(n < p * 2) return 0;
int p2 = p * 2;
if(n > p2 && h[p2].value > h[p2 + 1].value)
p2++;
if(h[p].value > h[p2].value)
{
swap(h + p, h + p2);
down(h, p2);
}
return 0;
}
int find_key(HEAP h, int i)
{
int j;
for(j = 1; j <= n; j++)
if(h[j].key == i)
return j;
return -1;
}
int insert(HEAP h, int k)
{
++n;
h[n].value = k;
h[n].key = KEY_ID++;
up(h, n);
return 0;
}
int remove(HEAP h, int p)
{
if(p <= 0) return 0;
h[p] = h[n--];
down(h, p);
up(h, p);
return 0;
}
int main(int argc, const char * argv[])
{
const int MAX = 5000001;
freopen("deque.in", "r", stdin);
//freopen("deque.out", "w", stdout);
long mins = 0;
int N, K;
scanf("%d %d", &N, &K);
HEAP H = new hnode[MAX];//malloc(MAX * sizeof(hnode));
int i, k, j;
n = 0;
KEY_ID = 1;
for(i = 1; i <= N; i++)
{
scanf("%d", &k);
insert(H, k);
if(i >= K)
{
mins += H[1].value;
remove(H, find_key(H, i-K+1));
}
}
ofstream fout("deque.out");
fout<<mins;
//printf("%ld", mins);
return 0;
}