C. Manhattan Subarrays
题目传送门:
题面:
题目大意:
定义了一个关系叫坏东西
:
三点间曼哈顿距离存在这种关系。
然后给你一排数字,代表的是 ( a i , i ) (a_i,i) (ai,i)的点。
问你这堆点里能找出几个不同连续子序列使得里面随意选三个点都不会是坏东西关系
。
如果选的数字量≤2,认为是符合条件的选择。
思路:
选择子序列长度为 l l l:
- l = = 1 l==1 l==1,按照题意,所有情况都符合。
- l = = 2 l==2 l==2,按照题意,所有情况都符合。
- l = = 3 l==3 l==3,按照题意: d ( i , j ) = ∣ a i − a j ∣ + j − i ( 1 ) d(i,j)=|a_i-a_j|+j-i(1) d(i,j)=∣ai−aj∣+j−i(1) d ( j , k ) = ∣ a j − a k ∣ + k − j ( 1 ) d(j,k)=|a_j-a_k|+k-j(1) d(j,k)=∣aj−ak∣+k−j(1) d ( i , k ) = ∣ a i − a k ∣ + k − i ( 2 ) d(i,k)=|a_i-a_k|+k-i(2) d(i,k)=∣ai−ak∣+k−i(2) d ( i , j ) + d ( j , k ) − d ( i , k ) = ∣ a i − a j ∣ + ∣ a j − a k ∣ − ∣ a i − a k ∣ d(i,j)+d(j,k)-d(i,k)=|a_i-a_j|+|a_j-a_k|-|a_i-a_k| d(i,j)+d(j,k)−d(i,k)=∣ai−aj∣+∣aj−ak∣−∣ai−ak∣最后一个式子不能等于零。通过计算容易得出就是这三个数字不能单调增减,需要中间的特小或者特大!
-
l
=
=
4
l==4
l==4,由上面的推下来,需要变成
大小大小
或者小大小大
这样。 - l ≥ 5 l≥5 l≥5,发现不可能,因为无法无论怎么取点都会取到单调增减的三个点,直接无了。
代码:
写了金箍棒代码,有点丑。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
typedef long long ll;
struct Node {
ll v;
int id;
} a[maxn];
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
ll ans = 2 * n - 1;
for (int i = 1; i <= n; i++) {
cin >> a[i].v;;
a[i].id = i;
}
for (int i = 2; i < n; i++) {
if (a[i].v < a[i - 1].v && a[i].v < a[i + 1].v || a[i].v > a[i - 1].v && a[i].v > a[i + 1].v) {
ans++;
}
}
for (int i = 1; i <= n - 3; i++) {
if (a[i + 1].v > a[i].v && a[i + 1].v > a[i + 2].v && a[i + 2].v < a[i + 3].v &&
a[i + 1].v != a[i + 3].v && a[i].v != a[i + 2].v && a[i + 1].v > a[i + 3].v && a[i + 2].v < a[i].v
||
a[i + 1].v < a[i].v && a[i + 1].v < a[i + 2].v && a[i + 2].v > a[i + 1].v && a[i + 2].v > a[i + 3].v &&
a[i + 1].v != a[i + 3].v && a[i].v != a[i + 2].v && a[i + 1].v < a[i + 3].v && a[i + 2].v > a[i].v)
ans++;
}
cout<<ans<<endl;
}
}