#include <bits/stdc++.h> using namespace std; int n, t[1000002], p[1000002], res; void in() { scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &t[i]); p[t[i]] = i; } } void calc1() { for(int i = 0; i < n; i++) { int d = 2 * n + 1 - 2 * t[i]; if(((d & 1) ^ 1) || d > n) continue; int it1 = max(0, i - d + 1), it2 = it1 - 1, ct = 0; while(it2 - it1 + 1 < d) { if(t[it2 + 1] > t[i]) ct++; it2++; } while(it1 <= i && it2 < n) { if(ct == d / 2) res++; if(t[it1] > t[i]) ct--; if(t[it2 + 1] > t[i]) ct++; it1++; it2++; } } } void calc2() { for(int i = 0; i < n; i++) { if(t[i] < n && p[t[i] + 1] > i) { int d = 2 * n + 1 - t[i] - (t[i] + 1); if(((d & 1) ^ 1) && d <= n && d >= p[t[i] + 1] - i + 1) { int it1 = max(0, p[t[i] + 1] - d + 1), it2 = it1 - 1, ct = 0; while(it2 - it1 + 1 < d) { if(t[it2 + 1] > t[i]) ct++; it2++; } while(it1 <= i && it2 < n) { if(ct == d / 2) res++; if(t[it1] > t[i]) ct--; if(t[it2 + 1] > t[i]) ct++; it1++; it2++; } } } if(t[i] > 1 && p[t[i] - 1] > i) { int d = 2 * n + 1 - t[i] - (t[i] - 1); if(((d & 1) ^ 1) && d <= n && d >= p[t[i] - 1] - i + 1) { int it1 = max(0, p[t[i] - 1] - d + 1), it2 = it1 - 1, ct = 0; while(it2 - it1 + 1 < d) { if(t[it2 + 1] < t[i]) ct++; it2++; } while(it1 <= i && it2 < n) { if(ct == d / 2) res++; if(t[it1] < t[i]) ct--; if(t[it2 + 1] < t[i]) ct++; it1++; it2++; } } } } } void out() { printf("%d %d", 2 * n + 1, res); } int main() { in(); calc1(); calc2(); out(); }
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 | #include <bits/stdc++.h> using namespace std; int n, t[1000002], p[1000002], res; void in() { scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &t[i]); p[t[i]] = i; } } void calc1() { for(int i = 0; i < n; i++) { int d = 2 * n + 1 - 2 * t[i]; if(((d & 1) ^ 1) || d > n) continue; int it1 = max(0, i - d + 1), it2 = it1 - 1, ct = 0; while(it2 - it1 + 1 < d) { if(t[it2 + 1] > t[i]) ct++; it2++; } while(it1 <= i && it2 < n) { if(ct == d / 2) res++; if(t[it1] > t[i]) ct--; if(t[it2 + 1] > t[i]) ct++; it1++; it2++; } } } void calc2() { for(int i = 0; i < n; i++) { if(t[i] < n && p[t[i] + 1] > i) { int d = 2 * n + 1 - t[i] - (t[i] + 1); if(((d & 1) ^ 1) && d <= n && d >= p[t[i] + 1] - i + 1) { int it1 = max(0, p[t[i] + 1] - d + 1), it2 = it1 - 1, ct = 0; while(it2 - it1 + 1 < d) { if(t[it2 + 1] > t[i]) ct++; it2++; } while(it1 <= i && it2 < n) { if(ct == d / 2) res++; if(t[it1] > t[i]) ct--; if(t[it2 + 1] > t[i]) ct++; it1++; it2++; } } } if(t[i] > 1 && p[t[i] - 1] > i) { int d = 2 * n + 1 - t[i] - (t[i] - 1); if(((d & 1) ^ 1) && d <= n && d >= p[t[i] - 1] - i + 1) { int it1 = max(0, p[t[i] - 1] - d + 1), it2 = it1 - 1, ct = 0; while(it2 - it1 + 1 < d) { if(t[it2 + 1] < t[i]) ct++; it2++; } while(it1 <= i && it2 < n) { if(ct == d / 2) res++; if(t[it1] < t[i]) ct--; if(t[it2 + 1] < t[i]) ct++; it1++; it2++; } } } } } void out() { printf("%d %d", 2 * n + 1, res); } int main() { in(); calc1(); calc2(); out(); } |