// 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); } |
English