#include<iostream>
using namespace std;
#define MAXN 1000002
#define ULL unsigned long long
int n;
int loc[MAXN];
int main() {
ios_base::sync_with_stdio(0);
cin >> n;
for(int i = 0; i < n; i++) {
int v;
cin >> v;
loc[v] = i;
}
ULL res = 1ll;
int nloc = loc[n];
int left = nloc, right = nloc;
// int leftok = 0, rightok = 0;
int ok = 0;
int others;
for(int i = 2 * n - 1; i > 0; i--) {
int credits = n - (i + 1) / 2;
if(i % 2 == 1) {
int add = (i - 1) / 2;
// cout << "trying " << add << ".5" << endl;
int l = loc[add];
// cout << "found " << add << " at " << l << endl;
ok++;
if(l > nloc) {
// rightok++;
if(right < l) {
right = l;
}
} else {
// leftok++;
if(left > l) {
left = l;
}
}
others = right - left - ok;
if(others <= credits) {
int free = credits - others;
int fleft = left;
int fright = n - (right + 1);
// cout << "free: " << free << endl;
if(fleft + fright < free) {
break;
}
int ways = max(0, min(free, min(fleft, fright)) - max(0, free - max(fleft, fright)));
res += 1ll + ways;
// cout << "can make " << add << ".5" << " in " << ways << " ways" << endl;
}
}
else {
// cout << "trying " << i / 2 << endl;
if(others <= credits) {
int free = credits - others;
int fleft = left;
int fright = n - (right + 1);
// cout << "free: " << free << endl;
if(fleft + fright < free) {
break;
}
int ways = max(0, min(free, min(fleft, fright)) - max(0, free - max(fleft, fright)));
res += 1ll + ways;
// cout << "can make " << i / 2 << " in " << ways << " ways" << endl;
}
}
// cout << "r, l, ok: " << right << " " << left << " " << ok << endl;
// cout << "others: " << others << ", credits: " << credits << endl;
}
cout << n + n + 1 << ' ' << res << 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 | #include<iostream> using namespace std; #define MAXN 1000002 #define ULL unsigned long long int n; int loc[MAXN]; int main() { ios_base::sync_with_stdio(0); cin >> n; for(int i = 0; i < n; i++) { int v; cin >> v; loc[v] = i; } ULL res = 1ll; int nloc = loc[n]; int left = nloc, right = nloc; // int leftok = 0, rightok = 0; int ok = 0; int others; for(int i = 2 * n - 1; i > 0; i--) { int credits = n - (i + 1) / 2; if(i % 2 == 1) { int add = (i - 1) / 2; // cout << "trying " << add << ".5" << endl; int l = loc[add]; // cout << "found " << add << " at " << l << endl; ok++; if(l > nloc) { // rightok++; if(right < l) { right = l; } } else { // leftok++; if(left > l) { left = l; } } others = right - left - ok; if(others <= credits) { int free = credits - others; int fleft = left; int fright = n - (right + 1); // cout << "free: " << free << endl; if(fleft + fright < free) { break; } int ways = max(0, min(free, min(fleft, fright)) - max(0, free - max(fleft, fright))); res += 1ll + ways; // cout << "can make " << add << ".5" << " in " << ways << " ways" << endl; } } else { // cout << "trying " << i / 2 << endl; if(others <= credits) { int free = credits - others; int fleft = left; int fright = n - (right + 1); // cout << "free: " << free << endl; if(fleft + fright < free) { break; } int ways = max(0, min(free, min(fleft, fright)) - max(0, free - max(fleft, fright))); res += 1ll + ways; // cout << "can make " << i / 2 << " in " << ways << " ways" << endl; } } // cout << "r, l, ok: " << right << " " << left << " " << ok << endl; // cout << "others: " << others << ", credits: " << credits << endl; } cout << n + n + 1 << ' ' << res << endl; } |
English