Cod sursa(job #869158)

Utilizator GagosGagos Radu Vasile Gagos Data 1 februarie 2013 00:25:32
Problema Parantezare optima de matrici Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

using namespace std;

int size = 0;
int* heap;
int* ary;
int* idx_before;
int* idx_after;

void insert(int i) {
  int son = ++size;
  int parent = son >> 1;

  heap[son] = i;

  while (parent > 0 && ary[heap[parent]] < ary[heap[son]]) {
    int aux = heap[parent];

    heap[parent] = heap[son];
    heap[son] = aux;
    son = parent;
    parent = son >> 1;
  }
}

int pop() {
  int index = heap[1];
  int parent = 1;
  int son = parent << 1;

  heap[1] = heap[size];

  while (son < size && ary[heap[parent]] < ary[heap[son]]) {
    int aux = heap[parent];
    int second_son = son | 1;

    if (ary[heap[son]] < ary[heap[second_son]]) {
      son = second_son;
    }

    heap[parent] = heap[son];
    heap[son] = aux;
    parent = son;
    son = parent << 1;
  }

  size -= 1;

  return index;
}

int main() {
  ifstream in("podm.in");
  ofstream out("podm.out");
  int n;
  int index;
  int sum = 0;
  int idx_b, idx_a;

  in >> n;

  n += 1;
  ary = new int[n + 7];
  heap = new int[n + 7];
  idx_before = new int[n + 7];
  idx_after = new int[n + 7];

  for (int i = 0; i < n; ++i) {
    in >> ary[i];

    if (i > 0 && i < n - 1) {
      insert(i);

      idx_before[i] = i - 1;
      idx_after[i] = i + 1;
    }
  }

  while (size) {
    index = pop();
    idx_a = idx_after[index];
    idx_b = idx_before[index];
    sum += ary[idx_b] * ary[index] * ary[idx_a];
    idx_after[idx_b] = idx_a;
    idx_before[idx_a] = idx_b;
  }

  out << sum;

  in.close();
  out.close();

  return 0;
}