Pagini recente » Cod sursa (job #1194829) | Cod sursa (job #214532) | Cod sursa (job #2487176) | Monitorul de evaluare | Cod sursa (job #1331175)
/*
Enunt:
Deque
Se da un sir A cu N numere intregi. Pentru fiecare subsecventa de lungime K sa se determine minimul, iar apoi sa se calculeze suma acestor minime.
Cerinta
Sa se afiseze suma ceruta.
Date de intrare
Pe prima linie a fisierului deque.in se afla numerele N si K cu semnificatia din enunt. Pe urmatoarele N linii se afla cate un numar intreg din sirul dat.
Date de ieşire
In fisierul de iesire deque.out se va afla un singur numar intreg reprezentand suma ceruta.
Restrictii si precizari
1 ≤ N ≤ 5 000 000
1 ≤ K ≤ N
Elementele din sir vor avea valori cuprinse intre -10 000 000 si 10 000 000
Pentru rezultat se recomanda folosirea tipurilor intregi pe 64 de biti
Exemplu
deque.in
9 3
-7
9
2
4
-1
5
6
7
1
deque.out
-2
Explicaţie
Minimele corespunzatoare fiecarei subsecvente de lungime 3 sunt: -7 2 -1 -1 -1 5 1, suma acestora fiind -2.
*/
/*
Rezolvare:
*/
#include <stdio.h>
FILE *in, *out;
int n, k, a[5000001], b[5000001];
long long s;
int main ()
{
int i, j, p1, p2;
in = fopen("deque.in", "r");
out = fopen("deque.out", "w");
fscanf(in, "%d", &n);
fscanf(in, "%d", &k);
for (i=1; i<=n; i++)
{
fscanf(in, "%d", &a[i]);
}
b[1] = 1;
p1 = 1; // inceputul lui b
p2 = 1; // sfarsitul lui b
for (i=2; i<k; i++)
{
while ((p2 >= p1) && (a[i] <= a[b[p2]]))
{
p2--;
}
b[p2+1] = i;
p2++;
}
s = 0;
for (i=k; i<=n; i++)
{
// actualizam pozitiile minimelor din b
while ((p2 >= p1) && (a[i] <= a[b[p2]]))
{
p2--;
}
b[p2+1] = i;
p2++;
// verificam daca a exiprat b[p1]
if (b[p1] < i-k+1)
p1++;
s = s + a[b[p1]];
}
fprintf(out, "%lld\n", s);
fclose(out);
fclose(in);
return 0;
}