#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const ll MAXN = 1000010;
ll rl[MAXN];
ll n;
int main() {
ios::sync_with_stdio(false);
cin >> n;
for(int i = 1; i <= n; i++) {
ll x;
cin >> x;
rl[x] = i;
}
ll l = rl[n], r = rl[n];
ll cd = 0, wn = 1;
ll k = 1, nxt;
for(int i = n-1; 2*(n-i) <= n; i--) {
nxt = rl[i];
k = n-i;
// cout << i << ' ' << nxt << endl;
if (nxt > r) {
r = nxt;
} else if(nxt < l) {
l = nxt;
}
cd = r - l + 1;
ll sl = 2*k;
ll lfs = min(sl - cd, l-1);
ll rfs = min(sl - cd, n-r);
ll xsl = sl - cd;
if (xsl == 0) {
wn += 1;
} else if(xsl > 0) {
if (rfs + lfs >= xsl) {
wn += rfs + lfs - xsl + 1;
}
}
// ll fs = (2*k) - cd;
// ll x = max((lfs + rfs) - fs + 1, 0LL);
// ll x = (rfs + lfs + cd) - (2*k);
// wn += x;
// cout << k << " " << 2*k << " | " << l << ' ' << r << " | " << xsl << ' ' << cd << " | " << lfs << ' ' << rfs << " | " << wn << endl;
sl = 2*k+1;
if (sl > n) {
break;
}
lfs = min(sl - cd, l-1);
rfs = min(sl - cd, n-r);
xsl = sl - cd;
if (xsl == 0) {
wn += 1;
} else if(xsl > 0) {
if (rfs + lfs >= xsl) {
wn += rfs + lfs - xsl + 1;
}
}
// fs = (2*k + 1) - cd;
// x = max((lfs + rfs) - fs + 1, 0LL);
// x = (rfs + lfs + cd) - (2*k+1);
// wn += x;
// cout << k << " " << 2*k+1 << " | " << l << ' ' << r << " | " << xsl << ' ' << cd << " | " << lfs << ' ' << rfs << " | " << wn << endl;
}
cout << (2*n)+ 1 << ' ' << wn << endl;
}
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 | #include <iostream> #include <vector> #include <string> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const ll MAXN = 1000010; ll rl[MAXN]; ll n; int main() { ios::sync_with_stdio(false); cin >> n; for(int i = 1; i <= n; i++) { ll x; cin >> x; rl[x] = i; } ll l = rl[n], r = rl[n]; ll cd = 0, wn = 1; ll k = 1, nxt; for(int i = n-1; 2*(n-i) <= n; i--) { nxt = rl[i]; k = n-i; // cout << i << ' ' << nxt << endl; if (nxt > r) { r = nxt; } else if(nxt < l) { l = nxt; } cd = r - l + 1; ll sl = 2*k; ll lfs = min(sl - cd, l-1); ll rfs = min(sl - cd, n-r); ll xsl = sl - cd; if (xsl == 0) { wn += 1; } else if(xsl > 0) { if (rfs + lfs >= xsl) { wn += rfs + lfs - xsl + 1; } } // ll fs = (2*k) - cd; // ll x = max((lfs + rfs) - fs + 1, 0LL); // ll x = (rfs + lfs + cd) - (2*k); // wn += x; // cout << k << " " << 2*k << " | " << l << ' ' << r << " | " << xsl << ' ' << cd << " | " << lfs << ' ' << rfs << " | " << wn << endl; sl = 2*k+1; if (sl > n) { break; } lfs = min(sl - cd, l-1); rfs = min(sl - cd, n-r); xsl = sl - cd; if (xsl == 0) { wn += 1; } else if(xsl > 0) { if (rfs + lfs >= xsl) { wn += rfs + lfs - xsl + 1; } } // fs = (2*k + 1) - cd; // x = max((lfs + rfs) - fs + 1, 0LL); // x = (rfs + lfs + cd) - (2*k+1); // wn += x; // cout << k << " " << 2*k+1 << " | " << l << ' ' << r << " | " << xsl << ' ' << cd << " | " << lfs << ' ' << rfs << " | " << wn << endl; } cout << (2*n)+ 1 << ' ' << wn << endl; } |
English