Cod sursa(job #1095519)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 31 ianuarie 2014 12:35:48
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <deque>
#include <utility>
#include <vector>

using namespace std;

void deque_add(deque<pair<int, int>>& d, int i, int x) {
  while(d.back().second >= x) d.pop_back();
  d.push_back(make_pair(i, x));
}

void deque_del(deque<pair<int, int>>& d, int i, int K) {
  while(i - d.front().first >= K) d.pop_front();
}

int main(int argc, char *argv[]) {
  freopen("deque.in", "r", stdin);
  freopen("deque.out", "w", stdout);

  int N, K;
  scanf("%d%d", &N, &K);

  vector<int> v;
  for(int i = 0; i < N; ++i) {
    int x;
    scanf("%d", &x);
    v.push_back(x);
  }

  long long s = 0;
  deque<pair<int, int>> d;
  d.push_back(make_pair(0, v[0]));
  for(int i = 1; i < K; ++i) {
    deque_add(d, i, v[i]);
  }
  s += d.front().second;
  for(int i = K; i < N; ++i) {
    deque_add(d, i, v[i]);
    deque_del(d, i, K);
    s += d.front().second;
  }

  printf("%lld\n", s);
  return 0;
}