首页 > 其他分享 >牛客-最长和谐连续子序列

牛客-最长和谐连续子序列

时间:2022-08-27 12:34:46浏览次数:76  
标签:seq 牛客 mp 和谐 序列 diff include

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

和谐连续序列是指一个连续序列中元素的最大值和最小值之间的差值正好是1。 现在,给定一个整数数组,你需要在所有可能的连续子序列中找到最长的和谐连续子序列的长度。
输入描述:
一行整数数组,由空格分割

输出描述:
一行一个数字表示答案,即最长和谐连续子序列的长度

输入例子1:
1 3 2 2 5 2 3 7

输出例子1:
3

例子说明1:
最长的连续和谐子序列是:[3,2,2]
输入例子2:
1 3 2 2 1 1 2 3

输出例子2:
5

例子说明2:
最长的连续和谐子序列是:[2,2,1,1,2]   滑动窗口来做这道题,对于区间[l,r]内的元素最大值和最小值的差必须是1才满足条件,也就是说区间内的元素要么和seq[l]相同,要么跟seq[l]的差diff是1或者-1,不能同时出现diff是1和-1的情况。 如果对于当前区间来说abs(seq[r]-seq[l])大于1,那么显然包含seq[r]的和谐子序列不能包含元素seq[l],这里用map记录每个元素最后出现的位置,可以直接让l=mp[seq[l]] + 1。 如果新的seq[r]和seq[l]的差值跟当前和谐子序列的差值不一样,比如seq[r] - seq[l] == 1,而[l,r-1]的diff是-1,显然包含seq[r]的和谐子序列不能包含seq[l]+diff。   代码:
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
#include <string>
#include <unordered_map>
using namespace std;

int main()
{
    int maxd = 0;
    long long d;
    vector<long long> seq;
    while (~scanf("%lld", &d))
    {
        seq.push_back(d);
    }
    int l = 0, r = 0;
    long long diff = 0;
    unordered_map<long long, int> mp;
    while (r < seq.size())
    {
        mp[seq[r]] = r;
        if (abs(seq[r] - seq[l]) > 1)
        {
            l = mp[seq[l]] + 1;
            diff = 0;
        }
        else if(diff * (seq[r] - seq[l]) < 0)
        {
            l = mp[seq[l] + diff] + 1;
            diff = 0;
        }
        else
        {
            diff = seq[r] - seq[l] ? seq[r] - seq[l] : diff;
            r++;
            if (!diff)
            {
                continue;
            }
            maxd = max(maxd, r - l);
        }
    }
    printf("%d", maxd);
}

 

标签:seq,牛客,mp,和谐,序列,diff,include
From: https://www.cnblogs.com/8023spz/p/16630338.html

相关文章

  • CCF 202112-2 序列查询新解(C++)
    该题关键点在于:分段计算先对f分段:for(inti=1;i<=n+1;i++)//以f(i)为区域划分计算在此区域内f的取值相同,值为:i-1。再对每个f值相同的区域按照g值进行分段:for(int......
  • 799. 最长连续不重复子序列
    记录每个数字出现次数,如果又多次出现就从当前位置重新开始计算长度#include<iostream>usingnamespacestd;constintN=100010;intn;......
  • 牛客小白月赛56
    A分别输出\(n,(a+b)n\)B输出\(m\)个\(1\)C对\((2^i,i)\)排序,对\(a_i\)排序,从小到大依次放入ans数组D求出小于等于\(10^7\)的所有素数,用set存起来,依次删......
  • 2022牛客暑期多校集训解题报告 第一场
    A.Villages:Landlines题意:给定n-1个建筑和一个发电站,分布在一个一维的数轴上,这n-1个建筑都有各自的电力接受范围,不连通的建筑可以通过电相连,问使每个建筑都通上电......
  • CTFSHOW Web259 SoapClient原生类的反序列化
      index.php   看到该题目第一眼,大脑直接一个简单的想法就是通过访问flag.php添加X-Forwarded-For然后POST发送token数据。但!在本题的环境当中,由于使用了Clou......
  • rest_framework:序列化器类
    一.序列化器类序列化就是把数据转换为json在服务端发送到客户端反序列化是客户端法的数据发送到服务端服务端通过反序列化把数据转换为jsonfromrest_frameworkimp......
  • 面试题:Java序列化与反序列化
    目录序列化和反序列化的概念应用场景?序列化实现的方式继承Serializable接口,普通序列化继承Externalizable接口,强制自定义序列化serialVersionUID的作用静态变量不会被序列......
  • 蔚来杯2022牛客暑期多校训练营10 题解
    D.MiReDoSiLa?SoFa![NOI2016]优秀的拆分原题。枚举周期\(k\),并将位置为\(k\)的倍数的点设为关键点。枚举相邻两个点\(i,i+k\),并求出\(lcp(S[i...n],S[i+k......
  • 序列查询新解
    https://www.acwing.com/problem/content/4284/#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;constin......
  • DRF当中序列化器中通过重写create()来实现保护登录保护
    在DRF原来源码框架中,我们知道保存的用户信息时,用户的密码是被明文保存到数据库中。代码实classUserRegisterModelSerializer(serializers.ModelSerializer)   """......