Manhattan Subarrays(思维)
题意:
定义 d ( a , b ) 指的是 a和b的曼哈顿距离。
认为一个点的三元组 {a,b,c} 是不好的指,d (a,b) = d (a,c) + d(b,c) ;
给你一个长度2e5的数组A,问有多少个字串满足不存在不好的三元组 { (A[i] , i ),(A[j] ; j) ,(A[k] , k) }。
思路:
通过绝对值等式,我们不难发现如果一个三元组是不好的,只有可能是d(a,c)=d(a,b)+d(b,c); (a<b<c);
那么就意味着 | xa - xc | = | xa - xb | +| xb -xc | ;
成立时,当且仅当 xa <= xb <= xc;
我们现在需要一个区间内,不存在一个不好的三元组,我们可以发现,这个区间的长度不会大于4,那么直接暴力就好了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s[200040];
int w[200050];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&s[i]);
ll ans=0;
for(int i=1;i<=n;i++){
for(int j=0;j<4&&i+j<=n;j++){
if(j==0||j==1)ans++;
else if(j==2){
if(s[i]<=s[i+1]&&s[i+1]<=s[i+2])break;
if(s[i]>=s[i+1]&&s[i+1]>=s[i+2])break;
ans++;
}else{
if(s[i]<=s[i+1]&&s[i+1]<=s[i+3])continue;
if(s[i]>=s[i+1]&&s[i+1]>=s[i+3])continue;
if(s[i]<=s[i+2]&&s[i+2]<=s[i+3])continue;
if(s[i]>=s[i+2]&&s[i+2]>=s[i+3])continue;
if(s[i+1]<=s[i+2]&&s[i+2]<=s[i+3])continue;
if(s[i+1]>=s[i+2]&&s[i+2]>=s[i+3])continue;
ans++;
}
}
//printf("%lld\n",ans);
}
printf("%lld\n",ans);
}
return 0;
}