Educational Codeforces Round 111 (Rated for Div. 2) C. Manhattan Subarrays(思维)

题目链接

题意:

对于平面上的两点 \(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的,

image

形状是这样的就可以,
而看长度为5的:
image

这样就不符合,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值