Pagini recente » Cod sursa (job #192637) | Cod sursa (job #415641) | Cod sursa (job #2736262) | Cod sursa (job #3146749) | Cod sursa (job #3216918)
/*
AM un sir cu N elem vr sa iau subsiruri de lg K si sa
iau minimul subsirului si sa l adun la o suma;
idee : HEAP
cand trecem la o sub ce incepe cu i+1 de la cea cu i
pierdem primul el, si adaugam urm
in heap avem elMinim;
daca pos lui < i, ii dam pop;
dam push
*/
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
const int MAX_VAL = 10000000;
#define VI vector<int>
#define PI pair<short, short>
#define PQ priority_queue
void brute();
void heapSol();
void heapOptim();
void read();
VI sir;
int N, K;
PQ<PI, vector<PI>, greater<PI>> heap;
int main() {
read();
heapOptim();
}
void heapOptim() {
heap.push(make_pair(sir[K - 1], K - 1));
for (int i = K - 2; i >= 0; --i) {
if (sir[i] < heap.top().first) {
heap.push(make_pair(sir[i], i));
}
}
long long suma = heap.top().first;
//fout << suma << ' ';
for (int i = K; i < N; ++i) {
int no;
fin >> no;
heap.push(make_pair(no, i));
while (heap.top().second < i - K + 1) {
heap.pop();
}
// fout << heap.top().first << ' ';
suma += heap.top().first;
}
//fout << '\n';
fout << suma;
}
void read() {
fin >> N >> K;
sir = VI(K + 1);
for (int i = 0; i < K; ++i) {
fin >> sir[i];
}
}
void heapSol() {
fin >> N >> K;
for (int i = 0; i < K; ++i) {
int no;
fin >> no;
heap.push(make_pair(no, i));
}
long long suma = heap.top().first;
for (int i = K; i < N; ++i) {
int no;
fin >> no;
heap.push(make_pair(no, i));
while (heap.top().second < i - K + 1) {
heap.pop();
}
//fout <<heap.top().first << ' ';
suma += heap.top().first;
}
fout << suma;
}
void brute() {
fin >> N >> K;
sir = VI(N + 1);
for (int i = 0; i < N; ++i) {
fin >> sir[i];
}
long long suma = 0;
int lastPos = -1;
int minSub;
for (int i = 0; i <= N - K; ++i) {
if (lastPos < i) {
//fout << " AIO";
minSub = MAX_VAL;
for (int j = 0; j < K; ++j) {
if (sir[i + j] < minSub) {
minSub = sir[i + j];
lastPos = i + j;
}
}
} else {
minSub = min(sir[i + K - 1], minSub);
}
suma += minSub;
}
fout << suma;
}