题意:
对于平面上的两点 \(p(x_p,y_p),q(x_q,y_q)\)我们定义它们之间的曼哈顿距离 \(d(p,q)=|x_p-x_q|+|y_p-y_q|\)。进一步定义由三个点构成的一组点 \(p,q,rp,q,r\) 是坏的仅当 \(d(p,r)=d(p,q)+d(q,r)\)。
我们定义序列 \(b\) 是好的仅当无法选出一组互不相同的整数 \(i,j,k\) 使得 \((b_i,i),(b_j,j),(b_k,k)\) 这组点是坏的。
给定长度为 n 的序列 a,求 a 有多少个子段是好的。T 组数据。
分析:
我们分析长度一下,长度为1或者为2的一定是可以的,再看长度为3的。
v字形,或者^型就行,就是没有相等的平的
长度为4的,
形状是这样的就可以,
而看长度为5的:
这样就不符合,2和5中间有4这就不符合条件。
综上,长度大于4的一定不可以。
void solve()
{
ll n;cin>>n;
ll a[n+1];
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
if(n==1){
puts("1");
return ;
}
ll ans=n*2-1;// two
for(int i=3;i<=n;i++){///three
if(a[i-2] <= a[i-1] && a[i-1] <= a[i]) continue;
if(a[i-2] >= a[i-1] && a[i-1] >= a[i]) continue;
if(a[i-2] == a[i-1] || a[i-1] == a[i]) continue;
ans++;
}
for(int i = 4;i <= n;i ++){
if(a[i - 3] < a[i - 1] && a[i - 3] > a[i - 2] && a[i] < a[i - 1] && a[i] > a[i - 2]) ans++;
if(a[i - 3] > a[i - 1] && a[i - 3] < a[i - 2] && a[i] > a[i - 1] && a[i] < a[i - 2]) ans++;
}
cout<<ans<<endl;
}