Educational Codeforces Round 111 (Rated for Div. 2)_C. Manhattan Subarrays

C. Manhattan Subarrays

题目传送门:

题目传送门

题面:

在这里插入图片描述

题目大意:

定义了一个关系叫坏东西
在这里插入图片描述
三点间曼哈顿距离存在这种关系。

然后给你一排数字,代表的是 ( a i , i ) (a_i,i) (ai,i)的点。

问你这堆点里能找出几个不同连续子序列使得里面随意选三个点都不会是坏东西关系

如果选的数字量≤2,认为是符合条件的选择。

思路:

选择子序列长度为 l l l:

  1. l = = 1 l==1 l==1,按照题意,所有情况都符合。
  2. l = = 2 l==2 l==2,按照题意,所有情况都符合。
  3. 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)=aiaj+ji(1) d ( j , k ) = ∣ a j − a k ∣ + k − j ( 1 ) d(j,k)=|a_j-a_k|+k-j(1) d(j,k)=ajak+kj(1) d ( i , k ) = ∣ a i − a k ∣ + k − i ( 2 ) d(i,k)=|a_i-a_k|+k-i(2) d(i,k)=aiak+ki(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)=aiaj+ajakaiak最后一个式子不能等于零。通过计算容易得出就是这三个数字不能单调增减,需要中间的特小或者特大!
  4. l = = 4 l==4 l==4,由上面的推下来,需要变成大小大小或者小大小大这样。
  5. l ≥ 5 l≥5 l5,发现不可能,因为无法无论怎么取点都会取到单调增减的三个点,直接无了。

代码:

写了金箍棒代码,有点丑。

#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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值