Cod sursa(job #3172504)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 20 noiembrie 2023 19:24:00
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 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 = 5e6 + 7;
int v[nmax];

struct MinStacks {
	stack<pair<int, int>> stanga, dreapta;
	// un element este de forma <numar, minim pe care il avem in stiva sub elementul curent>

	void add_element(int index) {
		int val = v[index];
		if(stanga.empty()) {
			stanga.push({val, val});
		} else {
			stanga.push({val, min(val, stanga.top().second)});
		}
	}

	void remove_element(int index) {
		// dar nu avem nevoie de index

		if(dreapta.empty()) {
			while(!stanga.empty()) {
				int val = stanga.top().first;
				stanga.pop();

				if(dreapta.empty()) {
					dreapta.push({val, val});
				} else {
					dreapta.push({val, min(val, dreapta.top().second)});
				}
			}
		}
	
		dreapta.pop();
	}

	// analog, trebuie sa facem reverse si cand vrem primul element
	// totusi, in problema asta nu avem nevoie de first_element

	int get_min() {
		if(dreapta.empty() && stanga.empty()) return -1; // nu se intampla

		if(dreapta.empty()) return stanga.top().second;
		if(stanga.empty()) return dreapta.top().second;

		return min(stanga.top().second, dreapta.top().second);
	}
};

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

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

	// initialize the window from [1 ... k]
	MinStacks ms;

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

	long long ans = ms.get_min();

	for(int i = k + 1; i <= n; i++) {
		ms.add_element(i);
		ms.remove_element(i - k);
		ans += ms.get_min();
	}

	cout << ans << endl;
}