题意
如果一个子数组能找出一个三元组,满足
d
(
p
,
r
)
=
d
(
p
,
q
)
+
d
(
q
,
r
)
d(p,r)=d(p,q)+d(q,r)
d(p,r)=d(p,q)+d(q,r)那么这个就是坏数组,求出非一个数组,子数组是非坏数组的个数。
解析
- 画图得结论:
1.三元组呈非递减或非递增那么这三元组就是坏三元组
2.数组长度为4的时候,枚举出4个长度为3的数组,如果4的三元组存在坏三元组那么这个长度为4的子数组就是坏的。
3.数组长度>4的时候,一会存在某个三元组呈非递减或非递增,因此不考虑。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
bool judge1(int a,int b,int c){
return (a<=b && b<=c )||(a>=b && b>=c);
}
int r [200005];
void solve(){
int n ;
cin>>n;
int res=n+n-1;
for(int i=1;i<=n;i++){
cin>>r[i];
}
for(int i=1;i+2<=n;i++){
if(!judge1(r[i],r[i+1],r[i+2])){
res++;
if(i+3<=n && !judge1(r[i],r[i+1],r[i+3]) && !judge1(r[i],r[i+2],r[i+3]) && !judge1(r[i+1],r[i+2],r[i+3])){
res++;
}
}
}
cout<<res<<endl;
}
int main(){
int t ;
cin>>t;
while(t--){
solve();
}
}