#include <bits/stdc++.h>
using namespace std;
constexpr int MAXN=1e6+7;
int tab[MAXN];
vector <int> liczby, liczby_pod;
int bs(int szukane) {
int lewy, prawy, mid;
lewy = 0;
prawy = liczby.size()-1;
while (prawy > lewy) {
mid = (prawy + lewy) / 2;
if (liczby[mid] < szukane)
lewy = mid + 1;
else
prawy = mid;
}
return lewy;
}
int bs2(int szukane) {
int lewy, prawy, mid;
lewy = 0;
prawy = liczby_pod.size()-1;
while (prawy > lewy) {
mid = (prawy + lewy) / 2;
if (liczby_pod[mid] < szukane)
lewy = mid + 1;
else
prawy = mid;
}
return lewy;
}
long long policz(int l, int r) {
long long wynik;
wynik = liczby_pod.size();
if (liczby_pod.size() & 1 == 1)
wynik += 2 * liczby_pod[(liczby_pod.size() + 1) / 2 - 1];
else
wynik += liczby_pod[liczby_pod.size() / 2 - 1] + liczby_pod[liczby_pod.size() / 2];
return wynik;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, ile_max_wynikow=0, X, Y;
long long max_wynik=0;
cin >> n;
for (int i=1; i <= n; i++) {
cin >> tab[i];
}
for (int i=1; i <= n; i++)
liczby.push_back(i);
for (int i=1; i <= n; i++) {
liczby_pod = liczby;
for (int j=n; j >= i; j--) {
if (policz(i, j) == max_wynik)
ile_max_wynikow++;
else if (policz(i, j) > max_wynik) {
max_wynik = policz(i, j);
ile_max_wynikow = 1;
}
liczby_pod.erase(liczby_pod.begin() + bs2(tab[j]));
}
liczby.erase(liczby.begin() + bs(tab[i]));
}
cout << max_wynik << ' ' << ile_max_wynikow << '\n';
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include <bits/stdc++.h> using namespace std; constexpr int MAXN=1e6+7; int tab[MAXN]; vector <int> liczby, liczby_pod; int bs(int szukane) { int lewy, prawy, mid; lewy = 0; prawy = liczby.size()-1; while (prawy > lewy) { mid = (prawy + lewy) / 2; if (liczby[mid] < szukane) lewy = mid + 1; else prawy = mid; } return lewy; } int bs2(int szukane) { int lewy, prawy, mid; lewy = 0; prawy = liczby_pod.size()-1; while (prawy > lewy) { mid = (prawy + lewy) / 2; if (liczby_pod[mid] < szukane) lewy = mid + 1; else prawy = mid; } return lewy; } long long policz(int l, int r) { long long wynik; wynik = liczby_pod.size(); if (liczby_pod.size() & 1 == 1) wynik += 2 * liczby_pod[(liczby_pod.size() + 1) / 2 - 1]; else wynik += liczby_pod[liczby_pod.size() / 2 - 1] + liczby_pod[liczby_pod.size() / 2]; return wynik; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, ile_max_wynikow=0, X, Y; long long max_wynik=0; cin >> n; for (int i=1; i <= n; i++) { cin >> tab[i]; } for (int i=1; i <= n; i++) liczby.push_back(i); for (int i=1; i <= n; i++) { liczby_pod = liczby; for (int j=n; j >= i; j--) { if (policz(i, j) == max_wynik) ile_max_wynikow++; else if (policz(i, j) > max_wynik) { max_wynik = policz(i, j); ile_max_wynikow = 1; } liczby_pod.erase(liczby_pod.begin() + bs2(tab[j])); } liczby.erase(liczby.begin() + bs(tab[i])); } cout << max_wynik << ' ' << ile_max_wynikow << '\n'; return 0; } |
English