#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int liczba_perlowych_klusek;
cin >> liczba_perlowych_klusek;
int rozmiar_podwojonego_garnka = 2 * liczba_perlowych_klusek;
vector<int> perlowy_bigosek(rozmiar_podwojonego_garnka + 2);
for (int i = 1; i <= liczba_perlowych_klusek; i++) {
cin >> perlowy_bigosek[i];
perlowy_bigosek[i + liczba_perlowych_klusek] = perlowy_bigosek[i];
}
int wartownik_konca_wszechswiata = rozmiar_podwojonego_garnka + 1;
vector<int> najblizszy_wiekszy_fafarafa(rozmiar_podwojonego_garnka + 2, wartownik_konca_wszechswiata);
vector<int> stos_nerwowych_perelek;
stos_nerwowych_perelek.reserve(rozmiar_podwojonego_garnka);
for (int i = rozmiar_podwojonego_garnka; i >= 1; i--) {
while (!stos_nerwowych_perelek.empty() && perlowy_bigosek[stos_nerwowych_perelek.back()] <= perlowy_bigosek[i]) {
stos_nerwowych_perelek.pop_back();
}
if (!stos_nerwowych_perelek.empty()) {
najblizszy_wiekszy_fafarafa[i] = stos_nerwowych_perelek.back();
}
stos_nerwowych_perelek.push_back(i);
}
const int ile_pieter_magii = 22;
vector<vector<int>> teleport_do_wiekszego(ile_pieter_magii, vector<int>(rozmiar_podwojonego_garnka + 2, wartownik_konca_wszechswiata));
for (int i = 1; i <= rozmiar_podwojonego_garnka + 1; i++) {
teleport_do_wiekszego[0][i] = najblizszy_wiekszy_fafarafa[i];
}
teleport_do_wiekszego[0][wartownik_konca_wszechswiata] = wartownik_konca_wszechswiata;
for (int poziom_kotlecika = 1; poziom_kotlecika < ile_pieter_magii; poziom_kotlecika++) {
for (int i = 1; i <= rozmiar_podwojonego_garnka + 1; i++) {
teleport_do_wiekszego[poziom_kotlecika][i] = teleport_do_wiekszego[poziom_kotlecika - 1][teleport_do_wiekszego[poziom_kotlecika - 1][i]];
}
}
int wynik_wielkiego_zachwytu = 1;
for (int poczatek_obrotu_sernika = 1; poczatek_obrotu_sernika <= liczba_perlowych_klusek; poczatek_obrotu_sernika++) {
int granica_baleronu = poczatek_obrotu_sernika + liczba_perlowych_klusek;
int gdzie_teraz_siedzi_glodny_wzrok = poczatek_obrotu_sernika;
int ile_razy_och_i_ach = 1;
for (int poziom_kotlecika = ile_pieter_magii - 1; poziom_kotlecika >= 0; poziom_kotlecika--) {
int skok_przez_parowke = teleport_do_wiekszego[poziom_kotlecika][gdzie_teraz_siedzi_glodny_wzrok];
if (skok_przez_parowke < granica_baleronu) {
ile_razy_och_i_ach += (1 << poziom_kotlecika);
gdzie_teraz_siedzi_glodny_wzrok = skok_przez_parowke;
}
}
wynik_wielkiego_zachwytu = max(wynik_wielkiego_zachwytu, ile_razy_och_i_ach);
}
cout << wynik_wielkiego_zachwytu << '\n';
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int liczba_perlowych_klusek; cin >> liczba_perlowych_klusek; int rozmiar_podwojonego_garnka = 2 * liczba_perlowych_klusek; vector<int> perlowy_bigosek(rozmiar_podwojonego_garnka + 2); for (int i = 1; i <= liczba_perlowych_klusek; i++) { cin >> perlowy_bigosek[i]; perlowy_bigosek[i + liczba_perlowych_klusek] = perlowy_bigosek[i]; } int wartownik_konca_wszechswiata = rozmiar_podwojonego_garnka + 1; vector<int> najblizszy_wiekszy_fafarafa(rozmiar_podwojonego_garnka + 2, wartownik_konca_wszechswiata); vector<int> stos_nerwowych_perelek; stos_nerwowych_perelek.reserve(rozmiar_podwojonego_garnka); for (int i = rozmiar_podwojonego_garnka; i >= 1; i--) { while (!stos_nerwowych_perelek.empty() && perlowy_bigosek[stos_nerwowych_perelek.back()] <= perlowy_bigosek[i]) { stos_nerwowych_perelek.pop_back(); } if (!stos_nerwowych_perelek.empty()) { najblizszy_wiekszy_fafarafa[i] = stos_nerwowych_perelek.back(); } stos_nerwowych_perelek.push_back(i); } const int ile_pieter_magii = 22; vector<vector<int>> teleport_do_wiekszego(ile_pieter_magii, vector<int>(rozmiar_podwojonego_garnka + 2, wartownik_konca_wszechswiata)); for (int i = 1; i <= rozmiar_podwojonego_garnka + 1; i++) { teleport_do_wiekszego[0][i] = najblizszy_wiekszy_fafarafa[i]; } teleport_do_wiekszego[0][wartownik_konca_wszechswiata] = wartownik_konca_wszechswiata; for (int poziom_kotlecika = 1; poziom_kotlecika < ile_pieter_magii; poziom_kotlecika++) { for (int i = 1; i <= rozmiar_podwojonego_garnka + 1; i++) { teleport_do_wiekszego[poziom_kotlecika][i] = teleport_do_wiekszego[poziom_kotlecika - 1][teleport_do_wiekszego[poziom_kotlecika - 1][i]]; } } int wynik_wielkiego_zachwytu = 1; for (int poczatek_obrotu_sernika = 1; poczatek_obrotu_sernika <= liczba_perlowych_klusek; poczatek_obrotu_sernika++) { int granica_baleronu = poczatek_obrotu_sernika + liczba_perlowych_klusek; int gdzie_teraz_siedzi_glodny_wzrok = poczatek_obrotu_sernika; int ile_razy_och_i_ach = 1; for (int poziom_kotlecika = ile_pieter_magii - 1; poziom_kotlecika >= 0; poziom_kotlecika--) { int skok_przez_parowke = teleport_do_wiekszego[poziom_kotlecika][gdzie_teraz_siedzi_glodny_wzrok]; if (skok_przez_parowke < granica_baleronu) { ile_razy_och_i_ach += (1 << poziom_kotlecika); gdzie_teraz_siedzi_glodny_wzrok = skok_przez_parowke; } } wynik_wielkiego_zachwytu = max(wynik_wielkiego_zachwytu, ile_razy_och_i_ach); } cout << wynik_wielkiego_zachwytu << '\n'; return 0; } |
English