Pagini recente » Rating Popescu Florin (popeflo) | Sedinta 2007-05-07 | Cod sursa (job #1136634) | Rating Tanase Monica (monicatanase) | Cod sursa (job #2829223)
#include <bits/stdc++.h>
#define DIMN 5000010
using namespace std;
int d[DIMN] , v[DIMN];
int main()
{
FILE *fin = fopen ("deque.in" , "r");
FILE *fout = fopen ("deque.out" , "w");
int n , k , i , p , u;
long long sol;
fscanf (fin,"%d%d",&n,&k);
for (i = 1 ; i <= n ; i++){
fscanf (fin,"%d",&v[i]);
}
/// ne prefacem ca se cere minimul intre pozitiile 1 si i
u = 0;
p = 1; /// p = pe ce pozitie "incepe" structura de date
sol = 0;
for (i = 1 ; i <= n ; i++){
/// vreau ca la finalul pasului curent
/// sa obtin minimul din secventa
/// de lungime k care se termina pe pozitia i
/// daca aceasta secventa exista
while (u >= p && v[i] <= v[d[u]]){
u--;
}
d[++u] = i;
if (i - d[p] + 1 > k){
p++;
}
if (i >= k){ /// exista o seventa valida care se termina pe i
sol += v[d[p]];
//printf ("minimul din secventa de lungime k care se termina pe i = %d este %d\n", i , v[d[p]]);
}
}
fprintf (fout,"%lld",sol);
/// 2 [4 6 8] 10 12 , k = 3
/// suntem la pasul i = 4
/// 1 [2 3 4 ...
/// eu sunt la pasul i = 4, solutia din d[1] = 1
/// 4 - 1 + 1 == 4 adica valoarea de pe pozitia 1
/// este minima pe o secventa mai mare decat k
/// putem pur si simplu sa scoatem pozitia 1
/// din structura
return 0;
}