#include <algorithm>
#include <cstdio>
#include <climits>
int indeksy[1000000]; // liczba-1 (0…N) => położenie na liście (0…N)
int main()
{
int N;
scanf("%d", &N);
for (int i=0; i<N; ++i) {
int A; scanf("%d", &A);
indeksy[A-1] = i; // wartości będą od 0 do N-1
}
int min_index = INT_MAX, max_index = INT_MIN;
unsigned long result = 0;
int max_l_ogarniete = 0;
for (int r=N-1; r>=0; --r) {
min_index = std::min(min_index, indeksy[r]);
max_index = std::max(max_index, indeksy[r]);
int min_l = max_index - min_index + 1; // minimalna długość przedziału zawierającego wszystkie wartości od N-1 do r
int max_l = std::min(N, 2*(N-r)-1); // maksymalna długość przedziału, który możemy skomponować z tych wartości
for (int l=std::max(min_l, max_l_ogarniete+1); l<=max_l; ++l) {
int min_pos_left = std::max(min_index-(l-min_l), 0);
int max_pos_right = std::min(max_index+(l-min_l), N-1);
result += 2+max_pos_right-min_pos_left - l;
max_l_ogarniete = l;
}
}
printf("%d %lu\n", 2*N+1, result);
}
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 | #include <algorithm> #include <cstdio> #include <climits> int indeksy[1000000]; // liczba-1 (0…N) => położenie na liście (0…N) int main() { int N; scanf("%d", &N); for (int i=0; i<N; ++i) { int A; scanf("%d", &A); indeksy[A-1] = i; // wartości będą od 0 do N-1 } int min_index = INT_MAX, max_index = INT_MIN; unsigned long result = 0; int max_l_ogarniete = 0; for (int r=N-1; r>=0; --r) { min_index = std::min(min_index, indeksy[r]); max_index = std::max(max_index, indeksy[r]); int min_l = max_index - min_index + 1; // minimalna długość przedziału zawierającego wszystkie wartości od N-1 do r int max_l = std::min(N, 2*(N-r)-1); // maksymalna długość przedziału, który możemy skomponować z tych wartości for (int l=std::max(min_l, max_l_ogarniete+1); l<=max_l; ++l) { int min_pos_left = std::max(min_index-(l-min_l), 0); int max_pos_right = std::min(max_index+(l-min_l), N-1); result += 2+max_pos_right-min_pos_left - l; max_l_ogarniete = l; } } printf("%d %lu\n", 2*N+1, result); } |
English