#include<algorithm> #include<array> #include<iomanip> #include<iostream> int main() { std::array<int, 1'000'001> pozycje; std::array<int, 1'000'001> liczby; int dlugosc; std::cin >> dlugosc; for (int i = 1; i <=dlugosc; ++i) { int liczba; std::cin >> liczba; pozycje[liczba] = i; liczby[i] = liczba; // } int64_t wszystkich_przedzialow = 0; int lewo = 0; int prawo = 0; int srodek = pozycje[dlugosc]; for (int i = 1; i <= dlugosc; ++i) { //for (int j = 1; j <= dlugosc; ++j ) { //std::cerr << std::setw(4) << liczby[j]; //} //std::cerr << std::endl; //for (int j = 1; j <= dlugosc; ++j ) { //std::cerr << std::setw(3) << ((j == srodek + lewo) ? 'L' : ' '); //std::cerr << std::setw(1) << ((j == srodek + prawo) ? 'P' : ' '); //} int potencjalnych_przedzialow = i; potencjalnych_przedzialow -= -lewo; potencjalnych_przedzialow -= prawo; //std::cerr << std::endl; //std::cerr << potencjalnych_przedzialow << std::endl; if (0 < potencjalnych_przedzialow) { wszystkich_przedzialow += potencjalnych_przedzialow; } if (i == dlugosc) { continue; } int odleglosc = pozycje[dlugosc-((i+1)/2)] - srodek; if (odleglosc < lewo) { lewo = odleglosc; } else if (prawo < odleglosc) { prawo = odleglosc; } //std::cerr << std::endl; //std::cerr << i+1 << std::endl; //std::cerr << dlugosc-((i+1)/2) << " <- P" << std::endl; //std::cerr << lewo << ' ' << prawo << std::endl; odleglosc = (i+1) - srodek; if (prawo < odleglosc) { prawo = odleglosc; } odleglosc = (dlugosc-i) - srodek; if (odleglosc < lewo) { lewo = odleglosc; } //std::cerr << lewo << ' ' << prawo << std::endl; } std::cout << (2 * dlugosc + 1) << ' ' << wszystkich_przedzialow << std::endl; 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<algorithm> #include<array> #include<iomanip> #include<iostream> int main() { std::array<int, 1'000'001> pozycje; std::array<int, 1'000'001> liczby; int dlugosc; std::cin >> dlugosc; for (int i = 1; i <=dlugosc; ++i) { int liczba; std::cin >> liczba; pozycje[liczba] = i; liczby[i] = liczba; // } int64_t wszystkich_przedzialow = 0; int lewo = 0; int prawo = 0; int srodek = pozycje[dlugosc]; for (int i = 1; i <= dlugosc; ++i) { //for (int j = 1; j <= dlugosc; ++j ) { //std::cerr << std::setw(4) << liczby[j]; //} //std::cerr << std::endl; //for (int j = 1; j <= dlugosc; ++j ) { //std::cerr << std::setw(3) << ((j == srodek + lewo) ? 'L' : ' '); //std::cerr << std::setw(1) << ((j == srodek + prawo) ? 'P' : ' '); //} int potencjalnych_przedzialow = i; potencjalnych_przedzialow -= -lewo; potencjalnych_przedzialow -= prawo; //std::cerr << std::endl; //std::cerr << potencjalnych_przedzialow << std::endl; if (0 < potencjalnych_przedzialow) { wszystkich_przedzialow += potencjalnych_przedzialow; } if (i == dlugosc) { continue; } int odleglosc = pozycje[dlugosc-((i+1)/2)] - srodek; if (odleglosc < lewo) { lewo = odleglosc; } else if (prawo < odleglosc) { prawo = odleglosc; } //std::cerr << std::endl; //std::cerr << i+1 << std::endl; //std::cerr << dlugosc-((i+1)/2) << " <- P" << std::endl; //std::cerr << lewo << ' ' << prawo << std::endl; odleglosc = (i+1) - srodek; if (prawo < odleglosc) { prawo = odleglosc; } odleglosc = (dlugosc-i) - srodek; if (odleglosc < lewo) { lewo = odleglosc; } //std::cerr << lewo << ' ' << prawo << std::endl; } std::cout << (2 * dlugosc + 1) << ' ' << wszystkich_przedzialow << std::endl; return 0; } |