首页 > 其他分享 >【非零段划分 / 2】

【非零段划分 / 2】

时间:2024-09-05 22:21:51浏览次数:6  
标签:cnt int 复杂度 划分 非零段 ans sum

题目


在这里插入图片描述

在这里插入图片描述



思路

第一种思路:按照表面题意,枚举p,处理数组后进行计数: 复杂度 ∈ O ( n ⋅ m ) 复杂度 \in O(n \cdot m) 复杂度∈O(n⋅m)
第二种思路:把数组看成一个二维的山形图,先将相邻的水平线段转化成点(对数组unique),再对每个子结构进行考虑 复杂度 ∈ O (    m i n ( n , m )    ) 复杂度 \in O(\;min(n, m)\;) 复杂度∈O(min(n,m))

具体思路:

  1. 先unique,把相邻相等的元素去重
  2. 分为三种子结构,考虑水面暴露其顶点后,其对非零段数量的贡献,记录在cnt[ ]数组中
    2.1. A形结构,只要“水面”暴露出顶点开始,对非零段数量的贡献为+1
    2.2. V形结构,只要“水面”暴露出顶点开始,对非零段数量的贡献为-1 把原本分离的两段合并了
    2.3 / \ 形结构,我们把中间点看作“顶点”,暴露顶点前后贡献不变
  3. 遍历 p    f o r    [ M − 1 , 1 ] p \; for \;[M-1, 1] pfor[M−1,1] 模拟水面降低,维护一个 s u m sum sum 作为计数器


TLE代码


#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N];
int main()
{
    int n;
    cin >> n;
    int amax = 0;
    for(int i = 1; i <= n; i++) cin >> a[i], amax = max(amax, a[i]);
    
    int ans = 0;
    for(int p = 1; p <= amax; p++)
    {
        int cnt = 0; int last = 0;
        for(int i = 1; i <= n; i++)
        {
            int x = a[i];
            if(a[i] < p) x = 0;
            if(x && !last) cnt++;
            last = x;
        }
        ans = max(ans, cnt);
    }
    
    cout << ans;
    return 0;
}


正确代码


#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+10, M = 1e4+10;
int cnt[M], a[N];
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    
    n = unique(a+1, a+n+1) - (a+1);
    a[0] = 0, a[n+1] = 0;
    for(int i = 1; i <= n; i++)
    {
        int x = a[i-1], y = a[i], z = a[i+1];
        if(x < y && z < y) cnt[y]++;
        if(x > y && z > y) cnt[y]--;
    }
    int ans = 0; int sum = 0;
    for(int i =  M - 1; i >= 1; i--)
    {
        sum += cnt[i];
        ans = max(ans, sum);
    }
    
    cout << ans;
    return 0;
}

标签:cnt,int,复杂度,划分,非零段,ans,sum
From: https://blog.csdn.net/m0_73669127/article/details/141938091

相关文章

  • 【JavaEE初阶】JVM内存划分和类加载过程以及垃圾回收
    目录......
  • JVM面试(二)内存区域划分
    内存区划分Java虚拟机在执行Java程序的过程中会把它锁管理的内存划分为若干个不同的数据区域。这些区域有各自不同的用途,以及创建和销毁的时间。有的区域随着虚拟机的进程一直存在,有的区域依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟......
  • 单片机内存区域划分
    目录一、C语言内存分区1、栈区2、堆区3、全局区(静态区)4、常量区5、代码区6、总结二、单片机存储分配1、存储器1.1RAM1.2ROM1.3FlashMemory1.4不同数据的存放位置2、程序占用内存大小一、C语言内存分区C语言在内存中一共分为如下几个区域,分别是:下面分别......
  • 763. 划分字母区间
    给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。示例1:输入:s="ababcbacadefegdehijhklij"输出:[9,7,8]......
  • 2024.9.2 Python,用栈写每日温度,等差数列划分,子串所有可能性,等差数列划分,深度优先搜索
    1.每日温度给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出:[1,1,4,2,......
  • 763. 划分字母区间(leetcode)
    https://leetcode.cn/problems/partition-labels/description/听说这题是字节广告一面的题有两种做法,但是思路大致相同,主要思路是先求出所有字符的出现的最远距离,然后不断往后遍历,更新当前片段的最远距离若是第一种做法,就是放在另一个循环中,不断更新最远距离,且维护这个en......
  • 【Unity】经典四叉树的实现以及和无空间划分加速下的效率对比分析
    背景假如场景中存在大量的对象,需要快速找到某个范围内的所有对象,如果通过传统的方式,就需要对所有的物体遍历,依次判断是否在范围中,这样非常耗时。所以通过空间划分的方法将其加速,本文中采用四叉树的方式,从实现思想和代码层面对效率进行分析。思想在空间划分算法中首先需要对所有......
  • 用Python给英语单词批量划分音节
    一、问题的缘起最近,有网友在我的视频下面留言,问我可否把英语单词进行音节的划分?我以前也有同样的想法,但是始终没有得到解决。但是,我想使用python,学习英语的人都很多,说不定有人已经编写了类似的模块供我们调用呢?问题截图于是,我就抱着试试看的心情,在网上搜了一下,果然,某搜索......
  • 数模国赛冲刺 | 数据预处理方法合集(特征工程、数据降维、数据划分、数据平衡)
    ​数据预处理方法合集(特征工程、数据降维、数据划分、数据平衡)本文继续介绍数据预处理中的特征工程、数据降维、数据划分、数据平衡的内容,接下来我们将详细地介绍具体的方法,文末可获得预处理方法合集PDF!目录特征工程特征选择(FeatureSelection)特征提取数据降维线性降......
  • 【openwrt-21.02】openwrt-21.02 T750 switch划分VLAN之后WAN口MAC地址和br-lan相同问
    Openwrt版本NAME="OpenWrt"VERSION="21.02-SNAPSHOT"ID="openwrt"ID_LIKE="ledeopenwrt"PRETTY_NAME="OpenWrt21.02-SNAPSHOT"VERSION_ID="21.02-snapshot"HOME_URL="https://openwrt.org/"BU......