Cod sursa(job #3172387)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 20 noiembrie 2023 16:10:56
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

#ifndef LOCAL
ifstream in("deque.in");
ofstream out("deque.out");
#define cin in
#define cout out
#endif

const int nmax = 5 * 1e6 + 7;
int v[nmax];

struct MinDeque {
	deque<int> indexes; // retine indexii elementelor din deque

	// eu vreau ca deque-ul indexes sa aiba o proprietate foarte specifica:
	// v[indexes[i]] <= v[indexes[j]], practic vreau ca elementele din deque sa fie sortate crescator
	
	// Cum fac asta? Am grija ca atunci cand adaug un element in deque sa scot toate elementele mai mari decat el

	void add_element(int index) {
		while(indexes.size() > 0 && v[indexes.back()] > v[index]) {
			indexes.pop_back();
		}
		indexes.push_back(index);
	}

	// Apoi cand scot un element de la indexes.front(), de fapt il scot doar daca exista
	// Fiindca anumite elemente dispar daca sunt alte elemente mai mici in dreapta lor

	void remove_element(int index) {
		if(indexes.size() > 0 && indexes.front() == index) {
			indexes.pop_front();
		}
	}

	int get_min() {
		return v[indexes.front()]; // imi da _VALOAREA_ minimului
	}
};

int main() {
	int n, k; cin >> n >> k;

	for(int i = 1; i <= n; i++) cin >> v[i];

	// Varianta finala: Folosim un deque pentru a retine minimul pe fiecare interval de lungime k
	// Folosim un deque pentru a retine minimul pe fiecare interval de lungime k

	MinDeque md;
	for(int i = 1; i <= k; i++) {
		md.add_element(i);
	}

	long long ans = md.get_min();

	for(int i = k + 1; i <= n; i++) {
		md.add_element(i);
		md.remove_element(i - k);

		ans += md.get_min();
	}

	cout << ans << "\n";
}