Cod sursa(job #1052659)

Utilizator impulseBagu Alexandru impulse Data 11 decembrie 2013 17:29:57
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
//
//  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 long int 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)
        {
            while(H[1].key < i - K) remove(H, 1);
            mins += H[1].value;
            remove(H, find_key(H, i-K+1));
        }
    }
    ofstream fout("deque.out");
    fout<<mins<<endl;
    //printf("%ld", mins);
    
    return 0;
}