C. Manhattan Subarrays
Link
样例解释:
(我丢,看了半小时才懂这是什么鬼)
样例1: 4 + 3 + 2 + 1;
样例2: 5 + (4 - 1) + 3 + 1
思路:
每个样例,选一个元素和两个元素都符合题意构不成bad数列
看三个元素连起来,那就是当形成峰和形成谷不可以,也就是不可以单增,不可以单减
看四个元素连起来,就是样例1的顺序和样例1反过来的顺序,四个元素也可以认为是单增和单减的二元素复合
看五个元素连起来,发现肯定会存在其中有三个元素可以单增,或可以单减,所以五个元素连起来以及之后的都不考虑
AC
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int main() {
int t;
cin >> t;
while(t -- ) {
int n;
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i];
int ans = n + n - 1;
for (int i = 2; i < n; i++ )
if(a[i] < a[i - 1] && a[i] < a[i + 1] || a[i] > a[i - 1] && a[i] > a[i + 1]) {
//cout << a[i - 1] << ' ' << a[i] << ' ' << a[i + 1] << endl;
ans ++;
}
for (int i = 1; i <= n - 3; i++ ) {
if(a[i + 1] > a[i] && a[i + 1] > a[i + 2] && a[i + 2] < a[i] &&
a[i + 2] < a[i + 3] && a[i + 1] > a[i + 3]
||
a[i + 1] < a[i] && a[i] < a[i + 2] &&
a[i + 2] > a[i + 3] && a[i + 1] < a[i + 3]) {
ans ++;
//cout << a[i] << ' ' << a[i + 1] << ' ' << a[i + 2] << ' ' << a[i + 3] << endl;
}
}
cout << ans << endl;
}
return 0;
}