【非零段划分 / 2】

2024-09-06 02:52
文章标签 划分 非零段

本文主要是介绍【非零段划分 / 2】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


在这里插入图片描述

在这里插入图片描述



思路

第一种思路:按照表面题意,枚举p,处理数组后进行计数: 复杂度 ∈ O ( n ⋅ m ) 复杂度 \in O(n \cdot m) 复杂度O(nm)
第二种思路:把数组看成一个二维的山形图,先将相邻的水平线段转化成点(对数组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[M1,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;
}

这篇关于【非零段划分 / 2】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140793

相关文章

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

【电子通识】洁净度等级划分及等级标准

洁净度常用于评估半导体、生物制药、医疗、实验室及科研院所、新能源等领域的洁净室、无尘室或者无菌室等环境。         一般来说,晶圆光刻、制造、测试等级为100级或1000级的洁净间,百级洁净间要求空气中0.5微米的尘埃粒子数不得超过每立方米3520个;等级为1000级的洁净间要求0.5微米的尘埃粒子数不得超过每立方米35200个。         晶圆切割或封装工序一

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

n条直线最多能划分出多少个平面?

N条直线,两两相交,其交点各不不同,则产生的交点数目为N个数中取2个数的组合; 同时,也只有这种情况下(两两相交,也交点不同),分割的平面数最多, 数目为: 2 + (N-1)(N+2)/2.  这里求最少平面数没有意义,因为最少平面数就是N+1, 即N条直线两两平行的时候,分割的平面最少。 举例: 1条直线分割平面数最多为2; a1 = 2 2条直线分割平面数最多为4;

在不损坏数据的情况下给WIN7重新划分分区

小易接到个求助电话:我的机器上已经装好了系统,但是只有一个分区。我不想重装系统重新分区,能不能再分出一个分区?   这个故障可能是困惑很多网友的一个故障。一般,有一些第三方的软件可以实现这些功能。但是,现在在 Windows Vista/Windows 7 里允许你对现有分区大小进行一定范围的调整。   来看一下操作办法:   准备工作   这个操作必须要求你的文件系统是 N

【JVM】JVM简介|运行流程|内存划分

目录 一、JVM简介 二、JVM运行流程 三、JVM运⾏时数据区(内存划分)  3.1 堆(线程共享) 3.2 栈 3.3 元数据区(方法区)(线程共享) 3.4 程序计数器(线程私有) 一、JVM简介 JVM是Java Virtua Machine的简称,意为Java虚拟机 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统 常⻅的虚

环上k划分的和的gcd的最大值【gcd基本性质的利用】

今早看到的题,想了下会做了,但是觉得这题挺有意思的,于是打算写一下做法。本题利用了gcd的基本性质:更相减损法以及结合律,平时做gcd的题基本没用到过这两性质,而本题对这性质进行了充分利用。 思路: 首先我们考虑给一个序列,我们该怎么做。 令 fn=∑ni=1ai f_n=\sum_{i=1}^n a_i。 我们考虑序列的一个 k+1 k+1划分 fx1,fx2−fx1,fx3−fx2

人工智能关键技术怎么清晰的划分

市面上关于人工智能关键技术的文章很多, 大体就是: 机器学习、深度学习、强化学习、计算机视觉、自然语言处理技术、语音处理、知识图谱、人机交互、自主无人系统技术等。 让我感到困惑的是,这里面很多内容都是相互交叉,有的是基础技术,有的是领域应用,有的是具体的落地场景,感觉全都混为一谈了(目前的视觉、NLP和语音不都是基于深度学习来做的吗?自动驾驶等不都是基于视觉等智能感知技术做的吗?)。 我们顺

【JavaEE初阶】JVM内存划分和类加载过程以及垃圾回收

目录 🌲内存划分 🚩堆(线程共享) 🚩栈 🚩元数据区 🍃类加载过程 🚩双亲委派模型 🎄垃圾回收机制(GC) 🚩找到谁是垃圾(不被继续使用的对象) 🚩释放对应的内存 🏀标记-清除 🏀复制算法 🏀标记-整理 🏀分代回收 🌲内存划分 JVM也就是Java进程,这个进程一旦跑起来之后,就会从操作系统这里,申请一大块内存空间,JVM接下来就要进一