#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; } |
English