#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAX = 1e6 + 213; ll tab[MAX]; ll odleglosc[MAX][2]; ll pozycja[MAX]; #define cerr if(0) clog ll sprawdz(int l, int r, ll res = -1) { vector <ll> t; for (int i = l; i <= r; ++i) t.push_back(tab[i]); ll suma = 0; sort(t.begin(), t.end()); if (t.size() % 2 == 0) { suma += t[t.size() / 2] + t[(t.size() / 2) - 1]; } else { suma += 2 * t[t.size() / 2]; } suma += t.size(); if (suma == res) { for (auto p: t) cerr << p << " "; cerr << "\nL= " << l << " R= " << r << " Wynik=" << suma << "\n\n"; } return suma; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N; cin >> N; int pozycjaN; for (int i = 0; i < N; ++i) { cin >> tab[i]; pozycja[tab[i]] = i; if (tab[i] == N) pozycjaN = i; } odleglosc[N][0] = odleglosc[N][1] = 0; for (int i = N - 1; i > 0; --i) { if (pozycja[i] > pozycja[N]) { odleglosc[i][1] = max(odleglosc[i + 1][1], pozycja[i] - pozycja[N]); odleglosc[i][0] = odleglosc[i + 1][0]; } else { odleglosc[i][1] = odleglosc[i + 1][1]; odleglosc[i][0] = max(odleglosc[i + 1][0], pozycja[N] - pozycja[i]); } } ll res = 1; int potrzebuje = N; int acum = 0; for (int i = N - 1; i > 0; --i) { if (acum % 2 == 0) potrzebuje -= 1; int ile_musze = odleglosc[potrzebuje][0] + odleglosc[potrzebuje][1]; int ile_liczb = N - i; cerr << "I= " << i << "\tpotrzebuje= " << potrzebuje << "\tile_musze= " << ile_musze << "\tile_moge= " << ile_liczb << "\n"; if (ile_musze <= ile_liczb) { int dostepnewlewo = pozycjaN - odleglosc[potrzebuje][0]; int dostepnewprawo = N - pozycjaN - odleglosc[potrzebuje][1] - 1; cerr << "dost w lewo= " << dostepnewlewo << "\tdost w prawo= " << dostepnewprawo << "\n"; int ilemoge = ile_liczb - ile_musze; cerr << "ile_moge= " << ilemoge << "\n"; cerr << "ile_moge2= " << dostepnewlewo + dostepnewprawo << "\n"; dostepnewlewo = min(dostepnewlewo, ilemoge); dostepnewprawo = min(dostepnewprawo, ilemoge); res += dostepnewprawo + dostepnewlewo - ilemoge; // res += max(0, min(dostepnewprawo + dostepnewlewo - ilemoge - 1, ilemoge)); res += 1; } cerr << res << "\n\n"; ++acum; } for (int i = 1; i <= N; ++i) { cerr << "I= " << i << "\tW lewo= " << odleglosc[i][0] << "\tW prawo= " << odleglosc[i][1] << "\n"; } cout << N + 1 + N << " " << res << "\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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include <bits/stdc++.h> using namespace std; using ll = long long; const int MAX = 1e6 + 213; ll tab[MAX]; ll odleglosc[MAX][2]; ll pozycja[MAX]; #define cerr if(0) clog ll sprawdz(int l, int r, ll res = -1) { vector <ll> t; for (int i = l; i <= r; ++i) t.push_back(tab[i]); ll suma = 0; sort(t.begin(), t.end()); if (t.size() % 2 == 0) { suma += t[t.size() / 2] + t[(t.size() / 2) - 1]; } else { suma += 2 * t[t.size() / 2]; } suma += t.size(); if (suma == res) { for (auto p: t) cerr << p << " "; cerr << "\nL= " << l << " R= " << r << " Wynik=" << suma << "\n\n"; } return suma; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N; cin >> N; int pozycjaN; for (int i = 0; i < N; ++i) { cin >> tab[i]; pozycja[tab[i]] = i; if (tab[i] == N) pozycjaN = i; } odleglosc[N][0] = odleglosc[N][1] = 0; for (int i = N - 1; i > 0; --i) { if (pozycja[i] > pozycja[N]) { odleglosc[i][1] = max(odleglosc[i + 1][1], pozycja[i] - pozycja[N]); odleglosc[i][0] = odleglosc[i + 1][0]; } else { odleglosc[i][1] = odleglosc[i + 1][1]; odleglosc[i][0] = max(odleglosc[i + 1][0], pozycja[N] - pozycja[i]); } } ll res = 1; int potrzebuje = N; int acum = 0; for (int i = N - 1; i > 0; --i) { if (acum % 2 == 0) potrzebuje -= 1; int ile_musze = odleglosc[potrzebuje][0] + odleglosc[potrzebuje][1]; int ile_liczb = N - i; cerr << "I= " << i << "\tpotrzebuje= " << potrzebuje << "\tile_musze= " << ile_musze << "\tile_moge= " << ile_liczb << "\n"; if (ile_musze <= ile_liczb) { int dostepnewlewo = pozycjaN - odleglosc[potrzebuje][0]; int dostepnewprawo = N - pozycjaN - odleglosc[potrzebuje][1] - 1; cerr << "dost w lewo= " << dostepnewlewo << "\tdost w prawo= " << dostepnewprawo << "\n"; int ilemoge = ile_liczb - ile_musze; cerr << "ile_moge= " << ilemoge << "\n"; cerr << "ile_moge2= " << dostepnewlewo + dostepnewprawo << "\n"; dostepnewlewo = min(dostepnewlewo, ilemoge); dostepnewprawo = min(dostepnewprawo, ilemoge); res += dostepnewprawo + dostepnewlewo - ilemoge; // res += max(0, min(dostepnewprawo + dostepnewlewo - ilemoge - 1, ilemoge)); res += 1; } cerr << res << "\n\n"; ++acum; } for (int i = 1; i <= N; ++i) { cerr << "I= " << i << "\tW lewo= " << odleglosc[i][0] << "\tW prawo= " << odleglosc[i][1] << "\n"; } cout << N + 1 + N << " " << res << "\n"; return 0; } |