题意:在区间内选取三个点,若两个点曼哈顿距离与XXX相等,则为Bad,否则为Good;
推一下可以发现,超过4个点,那么这个区间必为Bad,我们只需要枚举3个点与四个点是否为Bad就行。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define gcd(a, b) __gcd(a,b)
const long long mod = 1e9 + 7;
const int maxn = 1e5 + 5;
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n);
int num = 0;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
for (int i = 0; i < n - 2; ++i) {
if (a[i + 1] <= max(a[i + 2], a[i]) && a[i + 1] >= min(a[i], a[i + 2]));
else {
num++;
}
}
for (int i = 0; i < n - 3; ++i) {
if ((a[i + 1] <= max(a[i], a[i + 3]) && a[i + 1] >= min(a[i], a[i + 3])) ||
(a[i + 2] <= max(a[i], a[i + 3]) && a[i + 2] >= min(a[i], a[i + 3])) ||
(a[i + 1] <= max(a[i + 2], a[i]) && a[i + 1] >= min(a[i + 2], a[i])) ||
(a[i + 2] <= max(a[i + 1], a[i + 3]) && a[i + 2] >= min(a[i + 1], a[i + 3])));
// cout << a[i] << ' ' << a[i + 1] << ' ' << a[i + 2] << endl;
else {
//cout << a[i] << endl;
num++;
}
}
cout << num + 2 * n - 1 << endl;
}
return 0;
}