Manhattan Subarrays(思维)

Suppose you have two points p = ( x p , y p ) p=(x_p,y_p) p=(xp,yp) and q = ( x q , y q ) q=(x_q,y_q) q=(xq,yq). Let’s denote the Manhattan distance between them as d ( p , q ) = ∣ x p − x q ∣ + ∣ y p − y q ∣ d(p,q)=|x_p−x_q|+|y_p−y_q| d(p,q)=xpxq+ypyq.

Let’s say that three points p , q , r p, q, r p,q,r form a bad triple if 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).

Let’s say that an array b 1 , b 2 , … , b m b_1,b_2,…,b_m b1,b2,,bm is good if it is impossible to choose three distinct indices i , j , k i, j, k i,j,k such that the points ( b i , i ) , ( b j , j ) (b_i,i), (b_j,j) (bi,i),(bj,j) and ( b k , k ) (b_k,k) (bk,k) form a bad triple.

You are given an array a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,,an. Calculate the number of good subarrays of a a a. A subarray of the array a is the array a l , a l + 1 , … , a r a_l,a_{l+1},…,a_r al,al+1,,ar for some 1 ≤ l ≤ r ≤ n 1≤l≤r≤n 1lrn.

Note that, according to the definition, subarrays of length 1 1 1 and 2 2 2 are good.

Input

The first line contains one integer t ( 1 ≤ t ≤ 5000 ) t (1≤t≤5000) t(1t5000) — the number of test cases.

The first line of each test case contains one integer n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n (1≤n≤2⋅10^5) n(1n2105) — the length of array a.

The second line of each test case contains n n n integers a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 1 0 9 ) a_1,a_2,…,a_n (1≤a_i≤10^9) a1,a2,,an(1ai109).

It’s guaranteed that the sum of n doesn’t exceed 2 ⋅ 1 0 5 2⋅10^5 2105.

Output
For each test case, print the number of good subarrays of array a.

Example

input

3
4
2 4 1 3
5
6 9 1 9 6
2
13 37

output

10
12
3

Note

In the first test case, it can be proven that any subarray of a is good. For example, subarray [ a 2 , a 3 , a 4 ] [a_2,a_3,a_4] [a2,a3,a4] is good since it contains only three elements and:

  • d ( ( a 2 , 2 ) , ( a 4 , 4 ) ) = ∣ 4 − 3 ∣ + ∣ 2 − 4 ∣ = 3 < d ( ( a 2 , 2 ) , ( a 3 , 3 ) ) + d ( ( a 3 , 3 ) , ( a 4 , 4 ) ) = 3 + 1 + 2 + 1 = 7 d((a_2,2),(a_4,4))=|4−3|+|2−4|=3 < d((a_2,2),(a_3,3))+d((a_3,3),(a_4,4))=3+1+2+1=7 d((a2,2),(a4,4))=43+24=3<d((a2,2),(a3,3))+d((a3,3),(a4,4))=3+1+2+1=7;
  • d ( ( a 2 , 2 ) , ( a 3 , 3 ) ) < d ( ( a 2 , 2 ) , ( a 4 , 4 ) ) + d ( ( a 4 , 4 ) , ( a 3 , 3 ) ) d((a_2,2),(a_3,3)) < d((a_2,2),(a_4,4))+d((a_4,4),(a_3,3)) d((a2,2),(a3,3))<d((a2,2),(a4,4))+d((a4,4),(a3,3));
  • d ( ( a 3 , 3 ) , ( a 4 , 4 ) ) < d ( ( a 3 , 3 ) , ( a 2 , 2 ) ) + d ( ( a 2 , 2 ) , ( a 4 , 4 ) ) d((a_3,3),(a_4,4)) < d((a_3,3),(a_2,2))+d((a_2,2),(a_4,4)) d((a3,3),(a4,4))<d((a3,3),(a2,2))+d((a2,2),(a4,4));

In the second test case, for example, subarray [ a 1 , a 2 , a 3 , a 4 ] [a_1,a_2,a_3,a_4] [a1,a2,a3,a4] is not good, since it contains a bad triple ( a 1 , 1 ) , ( a 2 , 2 ) , ( a 4 , 4 ) (a_1,1), (a_2,2), (a_4,4) (a1,1),(a2,2),(a4,4):

  • d ( ( a 1 , 1 ) , ( a 4 , 4 ) ) = ∣ 6 − 9 ∣ + ∣ 1 − 4 ∣ = 6 d((a_1,1),(a_4,4))=|6−9|+|1−4|=6 d((a1,1),(a4,4))=69+14=6;
  • d ( ( a 1 , 1 ) , ( a 2 , 2 ) ) = ∣ 6 − 9 ∣ + ∣ 1 − 2 ∣ = 4 d((a_1,1),(a_2,2))=|6−9|+|1−2|=4 d((a1,1),(a2,2))=69+12=4;
  • d ( ( a 2 , 2 ) , ( a 4 , 4 ) ) = ∣ 9 − 9 ∣ + ∣ 2 − 4 ∣ = 2 d((a_2,2),(a_4,4))=|9−9|+|2−4|=2 d((a2,2),(a4,4))=99+24=2;

So, d ( ( a 1 , 1 ) , ( a 4 , 4 ) ) = d ( ( a 1 , 1 ) , ( a 2 , 2 ) ) + d ( ( a 2 , 2 ) , ( a 4 , 4 ) ) d((a_1,1),(a_4,4))=d((a_1,1),(a_2,2))+d((a_2,2),(a_4,4)) d((a1,1),(a4,4))=d((a1,1),(a2,2))+d((a2,2),(a4,4)).

STD

转述题意:若一个数组,里面存在三个元素, a i , a j , a k a_i,a_j,a_k ai,aj,ak 满足 i < j < k i<j<k i<j<k ( a i < a j < a k ) ∣ ∣ ( a i > a j > a k ) (a_i<a_j<a_k) || (a_i>a_j>a_k) (ai<aj<ak)(ai>aj>ak),则称这个数组是 “坏数组” 。现在给出一个数组,问它有多少个子数组不是 “坏数组” ,子数组是连续的。

有一个结论:任意长度大于等于 5 5 5 的数组都是 “坏数组”。在这个结论之上,就很好做这道题了。由于长度为 1 1 1 2 2 2 的数组必然不是 “坏数组” 所以,我们只需判断长度为 3 3 3 4 4 4 的子数组就行了。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T,n,a[N];

bool calc(int a,int b,int c){
	if(a>=b&&b>=c||a<=b&&b<=c) return false;
	return true;
}

void solve(){
	cin>>n;
	int ans=(n<<1)-1;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=3;i<=n;i++)
		if(calc(a[i-2],a[i-1],a[i])) 
			ans++;
	for(int i=4;i<=n;i++)
		if(calc(a[i-3],a[i-2],a[i-1])&&calc(a[i-3],a[i-2],a[i])&&
				calc(a[i-3],a[i-1],a[i])&&calc(a[i-2],a[i-1],a[i]))
			ans++;
	cout<<ans<<"\n";
}

int main(){
	ios::sync_with_stdio(false);
	for(cin>>T;T;T--) solve();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_51864047

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值