定义一个山峰数组为长度为 3 的数组 [a_1,a_2,a_3] ,满足 a_1<a_2 且 a_2>a_3 a_3" />。 给定一个长度为 n 的正整数数组 P ,你需要选择两个下标 i,j(1≤ i<j<n) ,并将 P 划分成三个非空连续子数组: b_1 = Σ_k=1^i P_k ; b_2 = Σ_k=i+1^j P_k ; b_3 = Σ_k=j+1^n P_k 。 若三元组 [b_1,b_2,b_3] 构成一个山峰数组,则称二元组 (i,j) 可行。请计算共有多少个不同的可行二元组 (i,j) 。
第一行输入一个整数 n(3≤ n≤ 2×10^5) ,表示数组 P 的长度。 第二行输入 n 个整数 P_1,P_2,...,P_n(1≤ P_i≤10^6) ,表示数组元素。
输出一个整数,表示可行二元组的数量。
5 1 2 3 4 5
2
考点:数组
数据规模 n ≤ 200000 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:数组
本题切入点
在数组上做「固定中间点、统计两侧满足大小关系的下标对数」的计数题,n≤2e5 需要 O(n log n) 的排序/树状数组统计。注意:源卷中本题的判定式(山峰条件)含未还原的公式片段,解析按「枚举 + 两侧计数」的通用思路给出,具体大小关系请以原题为准。
围绕数组的一次或多次线性扫描,边扫边维护统计量。
思路框架(数组 通法 · 非本题专属)
实现要点:注意下标从 0 还是 1 开始(题面里「下标从 1 开始」要自己减 1)。
复杂度:时间 O(n) | 空间 O(1) 或 O(n)
该范式的通法易错点
对照本题
样例 1
5 / 1 2 3 4 52解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:华为机试编程模拟题2。