Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAX_N = 1000001;
  6.  
  7. // Nusako kiek musyčių sukasi virš tam tikros lelijos.
  8. int musiu_sk[MAX_N];
  9. // Nusako per kiek laiko varlė sugebės nušokuoti nuo pirminės pozicijos ant
  10. // tam tikros lelijos.
  11. long long min_laikas[MAX_N];
  12.  
  13. int main() {
  14. freopen("varle.25.in", "r", stdin);
  15. freopen("varle.out", "w", stdout);
  16.  
  17. // Nusiskaitome duomenis.
  18. int leliju_kiekis, suolio_ilgis;
  19. cin >> leliju_kiekis >> suolio_ilgis;
  20.  
  21. for (int i = 1; i < leliju_kiekis; i += 1) {
  22. cin >> musiu_sk[i];
  23. }
  24.  
  25. // Pradinėje pozicijoje ir ant kranto (krantas modeliuojamas kaip papildoma
  26. // lelija) musių nėra.
  27. musiu_sk[0] = 0;
  28. musiu_sk[leliju_kiekis] = 0;
  29.  
  30. // Šioje struktūroje laikysime griežtai didėjančią `min_laikas` reikšmių seką.
  31. // Vardan paprastumo saugosime ne pačias reikšmes, o jų indeksus masyve `min_laikas`.
  32. deque<int> didejanti_seka;
  33.  
  34. // Mes jau esame ant lelijos, kurios indeksas 0.
  35. min_laikas[0] = 0;
  36. didejanti_seka.push_back(0);
  37.  
  38. for (int lelija = 1; lelija <= leliju_kiekis; lelija += 1) {
  39. // Nušokus ant lelijos būtinai teks suvalgyti visas muses.
  40. min_laikas[lelija] = musiu_sk[lelija];
  41.  
  42. // Ant šios lelijos šoksime nuo lelijos, kurią pasiekėme greičiausiai.
  43. min_laikas[lelija] += min_laikas[didejanti_seka.front()];
  44.  
  45. // Įdedame `min_laikas[lelija]` reikšmę į `didejanti_seka` struktūrą.
  46. // Prieš įdėjimą reikia pašalinti visas reikšmes, kurios yra didesnės nei
  47. // `min_laikas[lelija]`, kadangi mums reikia išlaikyti didėjančią seką.
  48. while (!didejanti_seka.empty() && min_laikas[didejanti_seka.back()] >= min_laikas[lelija]) {
  49. didejanti_seka.pop_back();
  50. }
  51. didejanti_seka.push_back(lelija);
  52.  
  53. // Mums rūpi tik paskutinės `suolio_ilgis` reikšmės.
  54. if (didejanti_seka.front() == lelija - suolio_ilgis) {
  55. didejanti_seka.pop_front();
  56. }
  57. }
  58.  
  59. cout << min_laikas[leliju_kiekis] << endl;
  60.  
  61. return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement