// Example program #include <iostream> #include <string> #define MAXN 1000003 int n; int a[MAXN]; int ktory_indeks[MAXN]; int lewy_koniec, prawy_koniec, ile_liczb, ile_zapasu, wolne_po_lewej, wolne_po_prawej; long long wynik, ile_mozliwosci; int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); ktory_indeks[a[i]] = i; } lewy_koniec = ktory_indeks[n]; prawy_koniec = ktory_indeks[n]; int wymuszona_liczba = (n-1); bool teraz_wymus = true; wynik = 1; ile_liczb = 1; for (int i = (n-1); i > 0; i--) { ile_liczb++; if (teraz_wymus) { lewy_koniec = std::min(lewy_koniec, ktory_indeks[wymuszona_liczba]); prawy_koniec = std::max(prawy_koniec, ktory_indeks[wymuszona_liczba]); wymuszona_liczba--; teraz_wymus = false; } else { teraz_wymus = true; } ile_zapasu = (ile_liczb - (prawy_koniec - lewy_koniec + 1)); if (ile_zapasu >= 0) { wolne_po_lewej = std::min(lewy_koniec, ile_zapasu); wolne_po_prawej = std::min((n - prawy_koniec - 1), ile_zapasu); wynik += wolne_po_lewej + wolne_po_prawej - ile_zapasu + 1; } } printf("%d %lld\n", 2*n + 1, wynik); }
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 | // Example program #include <iostream> #include <string> #define MAXN 1000003 int n; int a[MAXN]; int ktory_indeks[MAXN]; int lewy_koniec, prawy_koniec, ile_liczb, ile_zapasu, wolne_po_lewej, wolne_po_prawej; long long wynik, ile_mozliwosci; int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); ktory_indeks[a[i]] = i; } lewy_koniec = ktory_indeks[n]; prawy_koniec = ktory_indeks[n]; int wymuszona_liczba = (n-1); bool teraz_wymus = true; wynik = 1; ile_liczb = 1; for (int i = (n-1); i > 0; i--) { ile_liczb++; if (teraz_wymus) { lewy_koniec = std::min(lewy_koniec, ktory_indeks[wymuszona_liczba]); prawy_koniec = std::max(prawy_koniec, ktory_indeks[wymuszona_liczba]); wymuszona_liczba--; teraz_wymus = false; } else { teraz_wymus = true; } ile_zapasu = (ile_liczb - (prawy_koniec - lewy_koniec + 1)); if (ile_zapasu >= 0) { wolne_po_lewej = std::min(lewy_koniec, ile_zapasu); wolne_po_prawej = std::min((n - prawy_koniec - 1), ile_zapasu); wynik += wolne_po_lewej + wolne_po_prawej - ile_zapasu + 1; } } printf("%d %lld\n", 2*n + 1, wynik); } |