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