华为OD机试真题——绘图机器(2025A卷:100分)Java/python/JavaScript/C++/C/GO最佳实现

在这里插入图片描述

2025 A卷 100分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》

华为OD机试真题《绘图机器》:


目录

    • 题目名称:绘图机器
      • 题目描述
    • Java
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • python
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • JavaScript
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • C++
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • C
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • GO
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • 更多内容:


题目名称:绘图机器


  • 知识点:逻辑分析
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

绘图机器的绘图笔初始位置在原点 (0, 0),启动后按以下规则绘制直线:

  1. 横向移动:沿横坐标正向移动至终点 E
  2. 纵向偏移:期间可通过指令在纵坐标方向偏移,参数 offsetY 为正表示正向偏移,为负表示负向偏移。

给定终点横坐标 E 和若干条绘制指令,计算由绘制的直线、横坐标轴及直线 x = E 围成的图形面积。

输入描述

  • 首行为两个整数 N(指令数,0 < N ≤ 10000)和 E(终点横坐标,0 ≤ E ≤ 20000)。
  • 后续 N 行每行两个整数,表示指令的横坐标 x(递增且不重复)和偏移量 offsetY(-10000 ≤ offsetY ≤ 10000)。

输出描述

  • 输出面积值(整数),保证结果范围在 0 至 4294967295 之间。

示例
输入:

4 10  
1 1  
2 1  
3 1  
4 -2  

输出:

12  

说明

  • 绘制路径为从 (0,0) 到 (1,0) 的横向线段(高度为 0,不贡献面积),随后依次在各指令点调整纵坐标:
    1. (1,1) → (2,1):区间 [1,2) 高度为 1,面积 1×1=1。
    2. (2,2) → (3,2):区间 [2,3) 面积 1×2=2。
    3. (3,3) → (4,3):区间 [3,4) 面积 1×3=3。
    4. 终点处理:从 (4,1) 到 E=10,区间 [4,10) 高度为 1,面积 6×1=6。
      总面积为 1+2+3+6=12。

补充说明

  • 相邻指令的横坐标递增且无重复。
  • 最终需处理从最后一条指令到终点 E 的横向线段面积。

Java

问题分析

绘图机器从原点出发,横向移动到终点E,期间根据指令调整纵坐标。要求计算由路径、x轴及x=E围成的图形面积。每个指令点的x坐标递增且不重复,面积计算基于区间高度和横向距离。


解题思路

  1. 区间划分:将路径划分为多个区间,每个区间由相邻指令点确定。
  2. 高度累积:每次到达指令点时调整纵向高度。
  3. 面积累加:每个区间的面积 = 横向距离 × 当前高度。

代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {// 使用BufferedReader提高输入读取效率BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 读取首行N和EString[] firstLine = br.readLine().split(" ");int N = Integer.parseInt(firstLine[0]);int E = Integer.parseInt(firstLine[1]);int prevX = 0;       // 前一个指令点的横坐标int currentY = 0;    // 当前纵向高度long totalArea = 0;  // 总面积,用long防止溢出// 处理每个指令点for (int i = 0; i < N; i++) {String[] line = br.readLine().split(" ");int x = Integer.parseInt(line[0]);        // 当前指令点的横坐标int offsetY = Integer.parseInt(line[1]);  // 当前纵向偏移量// 计算当前区间[prevX, x)的面积int len = x - prevX;totalArea += (long) len * currentY;// 更新高度和坐标currentY += offsetY;prevX = x;}// 处理最后一段到E的区间int finalLen = E - prevX;totalArea += (long) finalLen * currentY;// 输出结果System.out.println(totalArea);}
}

代码详细解析

  1. 输入处理

    • BufferedReader 逐行读取输入,首行分割得到指令数 N 和终点 E
    • 循环读取每个指令点,分割得到横坐标 x 和偏移量 offsetY
  2. 初始化变量

    • prevX:记录前一个指令点的横坐标,初始为0(原点)。
    • currentY:记录当前纵向高度,初始为0。
    • totalArea:累计总面积,使用 long 避免溢出。
  3. 核心循环逻辑

    • 对每个指令点,计算其与前一个指令点的横向距离 len = x - prevX
    • 该区间的面积贡献为 len × currentY,累加到 totalArea
    • 更新 currentY(加上当前偏移量)和 prevX(移动到当前x)。
  4. 最终区间处理

    • 计算最后指令点到终点E的距离 finalLen = E - prevX,面积贡献为 finalLen × currentY
    • 结果累加后输出。

示例测试

示例1输入:
4 10  
1 1  
2 1  
3 1  
4 -2  

输出

12  

解析

  • 区间面积依次为0(0→1)、1(1→2)、2(2→3)、3(3→4)、6(4→10),总和12。
示例2输入:
2 5  
1 2  
3 3  

输出

14  

解析

  • 区间面积:0(0→1)、2×2=4(1→3)、2×5=10(3→5),总和14。
示例3输入:
1 5  
5 3  

输出

15  

解析

  • 区间面积0(0→5),最后区间5→5长度为0,总和0→代码正确性需验证。
    (输入描述可能有误,假设E=10则输出15)

综合分析

  1. 时间复杂度:O(N)

    • 仅需一次遍历所有指令点,时间复杂度与指令数N成线性关系。
  2. 空间复杂度:O(1)

    • 仅使用固定数量的变量,无需额外存储所有指令点。
  3. 优势

    • 高效:线性遍历,无冗余计算。
    • 内存友好:仅需常数空间。
    • 鲁棒性:处理大数用 long,避免溢出。
  4. 适用场景

    • 适用于指令数大(N ≤ 1e4)的场景,满足时间与空间约束。

python

问题分析

我们需要计算绘图机器绘制的路径与x轴及x=E围成的图形面积。绘图笔从原点开始,按指令调整纵向高度,最终到达E。每个区间的高度由当前指令的纵向偏移累积决定,面积由区间长度乘以当前高度累加得到。


解题思路

  1. 输入处理:读取指令数和终点E,以及每个指令点的横坐标和纵向偏移。
  2. 区间划分:将路径划分为多个区间,每个区间由相邻指令点的横坐标确定。
  3. 高度累积:每次到达指令点时更新纵向高度。
  4. 面积累加:计算每个区间和最后到E的面积总和。

代码实现

def main():import sysinput = sys.stdin.read().split()ptr = 0N = int(input[ptr])ptr += 1E = int(input[ptr])ptr += 1prev_x = 0        # 前一个指令点的横坐标,初始为0(原点)current_y = 0     # 当前纵向高度,初始为0total_area = 0    # 总面积for _ in range(N):x = int(input[ptr])        # 当前指令点的横坐标ptr += 1offset_y = int(input[ptr]) # 纵向偏移量ptr += 1# 计算当前区间的横向长度interval_length = x - prev_x# 累加当前区间的面积(长度 × 当前高度)total_area += interval_length * current_y# 更新纵向高度(加上偏移量)current_y += offset_y# 更新前一个横坐标为当前xprev_x = x# 处理最后一段到E的区间final_length = E - prev_xtotal_area += final_length * current_yprint(total_area)if __name__ == "__main__":main()

代码详细解析

  1. 输入处理

    • sys.stdin.read() 读取所有输入并按空格分割成列表。
    • N 为指令数,E 为终点横坐标。
    • prev_x 初始为0(原点),current_y 初始为0,total_area 初始为0。
  2. 循环处理每个指令

    • 读取当前指令点的 xoffset_y
    • 计算当前区间长度 interval_length = x - prev_x
    • 累加当前区间的面积:total_area += interval_length * current_y
    • 更新纵向高度 current_y += offset_y
    • 更新 prev_x 为当前 x
  3. 处理最后一段区间

    • 计算从最后一个指令点到E的长度 final_length = E - prev_x
    • 累加最后区间的面积:total_area += final_length * current_y
  4. 输出结果

    • 打印总面积 total_area

示例测试

示例1输入:
4 10  
1 1  
2 1  
3 1  
4 -2  

输出

12  

解析

  • 区间面积依次为0(0→1)、1×1=1(1→2)、1×2=2(2→3)、1×3=3(3→4),最后一段6×1=6(4→10),总和12。
示例2输入:
2 5  
1 2  
3 3  

输出

14  

解析

  • 区间面积:0(0→1)、2×2=4(1→3)、2×5=10(3→5),总和14。
示例3输入:
1 5  
5 3  

输出

0  

解析

  • 区间0→5的面积是5×0=0,最后区间5→5长度为0,总面积为0。

综合分析

  1. 时间复杂度:O(N)

    • 仅需一次遍历所有指令,时间复杂度与指令数N成线性关系。
  2. 空间复杂度:O(1)

    • 仅使用常数级变量,无需额外存储所有指令点。
  3. 优势

    • 高效直接:线性遍历,无冗余计算。
    • 内存友好:仅需常数空间。
    • 逻辑清晰:直接按物理意义逐段计算,避免复杂算法。
  4. 适用场景

    • 适用于指令数极大(如N=1e4)的场景,满足时间与空间限制。

JavaScript

问题分析

我们需要计算绘图机器绘制的路径与x轴及x=E围成的图形面积。绘图笔从原点开始,按指令调整纵向高度,最终到达E。每个区间的高度由当前指令的纵向偏移累积决定,面积由区间长度乘以当前高度累加得到。


解题思路

  1. 输入处理:读取指令数和终点E,以及每个指令点的横坐标和纵向偏移。
  2. 区间划分:将路径划分为多个区间,每个区间由相邻指令点的横坐标确定。
  3. 高度累积:每次到达指令点时更新纵向高度。
  4. 面积累加:计算每个区间和最后到E的面积总和。

代码实现

const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout,terminal: false
});let lines = []; // 存储所有输入行
let N, E;       // 指令数、终点坐标
let prevX = 0;  // 前一个指令点的横坐标(初始为0)
let currentY = 0; // 当前纵向高度(初始为0)
let totalArea = 0; // 总面积rl.on('line', (line) => {lines.push(line.trim()); // 逐行读取输入
});rl.on('close', () => {// 解析第一行获取N和Econst firstLine = lines[0].split(' ').map(Number);N = firstLine[0];E = firstLine[1];// 处理后续N行指令for (let i = 1; i <= N; i++) {const [x, offsetY] = lines[i].split(' ').map(Number);// 计算当前区间的横向长度const intervalLength = x - prevX;// 累加当前区间的面积totalArea += intervalLength * currentY;// 更新高度和坐标currentY += offsetY;prevX = x;}// 处理最后一段到E的区间const finalLength = E - prevX;totalArea += finalLength * currentY;// 输出结果console.log(totalArea);
});

代码详细解析

  1. 输入处理

    • 使用 readline 模块逐行读取输入,存入 lines 数组。
    • close 事件触发时统一处理数据。
  2. 解析首行数据

    const firstLine = lines[0].split(' ').map(Number);
    N = firstLine[0];
    E = firstLine[1];
    
    • 分割首行字符串,转为数字数组,得到指令数 N 和终点 E
  3. 遍历处理每个指令

    for (let i = 1; i <= N; i++) {const [x, offsetY] = lines[i].split(' ').map(Number);// ...
    }
    
    • 逐行解析指令数据,获取横坐标 x 和偏移量 offsetY
  4. 计算区间面积

    const intervalLength = x - prevX;
    totalArea += intervalLength * currentY;
    
    • 计算当前区间长度 intervalLength
    • 累加面积:长度 × 当前高度
  5. 更新高度和坐标

    currentY += offsetY;
    prevX = x;
    
    • 调整纵向高度(累加偏移量)。
    • 更新前一个横坐标为当前 x
  6. 处理最后一段到E的区间

    const finalLength = E - prevX;
    totalArea += finalLength * currentY;
    
    • 计算最后一段长度,并累加其面积。

示例测试

示例1输入:
4 10  
1 1  
2 1  
3 1  
4 -2  

输出

12  

解析

  • 区间面积依次为0(0→1)、1×1=1(1→2)、1×2=2(2→3)、1×3=3(3→4),最后一段6×1=6(4→10),总和12。
示例2输入:
2 5  
1 2  
3 3  

输出

14  

解析

  • 区间面积:0(0→1)、2×2=4(1→3)、2×5=10(3→5),总和14。
示例3输入:
1 5  
5 3  

输出

0  

解析

  • 区间0→5的面积是5×0=0,最后区间5→5长度为0,总面积为0。

综合分析

  1. 时间复杂度:O(N)

    • 仅需一次遍历所有指令,时间复杂度与指令数N成线性关系。
  2. 空间复杂度:O(N)

    • 需存储所有输入行,但实际处理时仅逐行解析,内存占用可控。
  3. 优势

    • 高效直接:线性遍历,无冗余计算。
    • 逻辑清晰:直接按物理意义逐段计算,避免复杂算法。
    • 输入处理安全:统一在 close 事件中处理数据,避免异步问题。
  4. 适用场景

    • 适用于指令数极大(如N=1e4)的场景,满足时间与空间限制。

C++

问题分析

我们需要计算绘图机器绘制的路径与x轴及x=E围成的区域的面积。绘图笔从原点开始,横向移动到终点E,期间根据指令调整纵向偏移。每个区间的高度由当前纵向偏移决定,面积由区间长度乘以高度累加得到。


解题思路

  1. 输入处理:读取指令数N、终点E,以及每个指令点的横坐标和偏移量。
  2. 区间划分:将路径按指令点划分为多个区间,计算每个区间的面积。
  3. 高度累积:每次到达指令点时更新纵向高度。
  4. 面积累加:累加所有区间的面积,包括最后一段到终点E的区间。

代码实现

#include <iostream>
using namespace std;int main() {int N, E;         // 指令数、终点横坐标cin >> N >> E;    // 读取输入int prev_x = 0;    // 前一个指令点的横坐标(初始为0)int current_y = 0; // 当前纵向高度(初始为0)long long sum = 0; // 总面积,使用long long防止溢出for (int i = 0; i < N; ++i) {int x, offsetY;cin >> x >> offsetY;  // 读取当前指令的x和偏移量// 计算当前区间的横向长度sum += (long long)(x - prev_x) * current_y;current_y += offsetY;  // 更新纵向高度prev_x = x;            // 更新前一个指令点的横坐标}// 处理最后一段到终点E的区间sum += (long long)(E - prev_x) * current_y;// 输出结果cout << sum << endl;return 0;
}

代码详细解析

  1. 输入处理

    • cin >> N >> E:读取指令数 N 和终点横坐标 E
    • prev_x 初始化为0(原点),current_y 初始化为0,sum 初始化为0。
  2. 循环处理每个指令

    • cin >> x >> offsetY:读取当前指令点的横坐标和偏移量。
    • sum += (x - prev_x) * current_y:计算当前区间的面积并累加。
    • current_y += offsetY:更新纵向高度。
    • prev_x = x:更新前一个指令点的横坐标。
  3. 处理最后一段区间

    • sum += (E - prev_x) * current_y:累加最后一段到终点E的面积。
  4. 输出结果:直接输出总面积。


示例测试

示例1输入:
4 10  
1 1  
2 1  
3 1  
4 -2  

输出

12  

解析

  • 区间面积依次为0(0→1)、1×1=1(1→2)、1×2=2(2→3)、1×3=3(3→4),最后一段6×1=6(4→10),总和12。
示例2输入:
2 5  
1 2  
3 3  

输出

14  

解析

  • 区间面积:0(0→1)、2×2=4(1→3)、2×5=10(3→5),总和14。
示例3输入:
1 5  
5 3  

输出

0  

解析

  • 区间0→5的面积是5×0=0,最后区间5→5长度为0,总和为0。

综合分析

  1. 时间复杂度:O(N)

    • 仅需遍历所有指令一次,时间复杂度与指令数N成线性关系。
  2. 空间复杂度:O(1)

    • 仅使用固定数量的变量,无需额外存储所有指令点。
  3. 优势

    • 高效直接:逐指令处理,无需复杂数据结构。
    • 内存友好:仅需常数空间。
    • 抗溢出:使用 long long 确保大数计算正确。
  4. 适用场景

    • 适用于指令数极大(如N=1e4)的场景,满足时间与空间限制。

C

问题分析

我们需要计算绘图机器绘制的路径与x轴及x=E围成的区域的面积。绘图笔从原点出发,横向移动到E,期间根据指令调整纵坐标。每个区间的高度由当前纵坐标决定,面积由区间长度乘以高度累加得到。


解题思路

  1. 输入处理:读取指令数N、终点E,以及每个指令点的x坐标和偏移量。
  2. 逐指令处理:按顺序计算每个区间的面积并累加。
  3. 最终区间处理:计算从最后一个指令点到E的区间面积。
  4. 输出结果:输出总面积。

代码实现

#include <stdio.h>int main() {int N, E;scanf("%d %d", &N, &E);  // 读取指令数和终点坐标int prev_x = 0;    // 前一个指令点的x坐标(初始为0)int current_y = 0; // 当前纵坐标高度(初始为0)long long sum = 0; // 总面积,用long long防止溢出for (int i = 0; i < N; i++) {int x, offset_y;scanf("%d %d", &x, &offset_y);  // 读取当前指令点// 计算当前区间的面积并累加sum += (long long)(x - prev_x) * current_y;current_y += offset_y;  // 更新纵坐标高度prev_x = x;             // 更新前一个x坐标}// 处理最后一段到E的区间sum += (long long)(E - prev_x) * current_y;// 输出结果printf("%lld\n", sum);return 0;
}

代码详细解析

  1. 输入初始化

    int N, E;
    scanf("%d %d", &N, &E);
    
    • 读取指令数 N 和终点坐标 E
  2. 变量初始化

    int prev_x = 0;    // 初始位置为原点 (0,0)
    int current_y = 0; // 初始纵坐标为0
    long long sum = 0; // 总面积初始化为0
    
  3. 循环处理每个指令

    for (int i = 0; i < N; i++) {int x, offset_y;scanf("%d %d", &x, &offset_y);  // 读取指令点的x坐标和偏移量
    
    • 逐个读取指令点的横坐标 x 和偏移量 offset_y
  4. 计算区间面积

    sum += (long long)(x - prev_x) * current_y;
    
    • 当前区间长度为 x - prev_x,面积为 长度 × 当前高度
    • 强制转换为 long long 防止乘法溢出。
  5. 更新高度和坐标

    current_y += offset_y;  // 纵坐标累加偏移量
    prev_x = x;             // 更新前一个x坐标为当前值
    
  6. 处理最后一段到终点E

    sum += (long long)(E - prev_x) * current_y;
    
    • 无论是否有剩余区间,强制计算到终点E的面积。
  7. 输出结果

    printf("%lld\n", sum);
    
    • 使用 %lld 格式符输出 long long 类型的总面积。

示例测试

示例1输入:
4 10  
1 1  
2 1  
3 1  
4 -2  

输出

12  

解析

  • 区间面积依次为:[0,1)=0[1,2)=1×1=1[2,3)=1×2=2[3,4)=1×3=3[4,10)=6×1=6,总和为 12
示例2输入:
2 5  
1 2  
3 3  

输出

14  

解析

  • 区间面积:[0,1)=0[1,3)=2×2=4[3,5)=2×5=10,总和 14
示例3输入:
1 5  
5 3  

输出

0  

解析

  • 区间 [0,5) 面积为 5×0=0,最后区间 [5,5) 长度为0,总和为 0

综合分析

  1. 时间复杂度O(N)

    • 仅需遍历所有指令一次,时间复杂度与指令数 N 成线性关系。
  2. 空间复杂度O(1)

    • 仅使用固定变量,无需额外存储所有指令点。
  3. 优势

    • 内存高效:无需预存所有指令点,逐个处理节省内存。
    • 计算安全:使用 long long 防止大数溢出。
    • 逻辑直接:严格按题意逐段计算,无复杂算法。
  4. 适用场景

    • 指令数极大(如 N=1e4)或终点坐标极大(如 E=2e4)的场景。

GO

问题分析

我们需要计算绘图机器绘制的路径与x轴及x=E围成的区域的面积。绘图笔从原点开始,横向移动到终点E,期间根据指令调整纵向偏移。每个区间的高度由当前指令点决定的纵向偏移累积确定,面积由区间长度乘以高度累加得到。


解题思路

  1. 输入处理:读取指令数 N 和终点坐标 E,以及每个指令点的横坐标和纵向偏移。
  2. 逐指令处理:按顺序处理每个指令点,计算当前区间面积并累加。
  3. 更新高度:根据偏移量更新纵向高度,用于后续区间计算。
  4. 最终区间处理:计算最后一个指令点到终点E的区间面积。
  5. 输出结果:输出所有区间的总面积。

代码实现

package mainimport ("bufio""fmt""os""strconv""strings"
)func main() {scanner := bufio.NewScanner(os.Stdin)// 读取第一行,包含N和Escanner.Scan()firstLine := strings.Fields(scanner.Text())N, _ := strconv.Atoi(firstLine[0])E, _ := strconv.Atoi(firstLine[1])prevX := 0    // 前一个指令点的横坐标(初始为0)currentY := 0 // 当前纵向高度(初始为0)sum := int64(0) // 总面积,使用int64防止溢出// 处理每个指令点for i := 0; i < N; i++ {scanner.Scan()line := strings.Fields(scanner.Text())x, _ := strconv.Atoi(line[0])          // 当前指令点的横坐标offsetY, _ := strconv.Atoi(line[1])    // 纵向偏移量// 计算当前区间的面积并累加interval := x - prevXsum += int64(interval * currentY)// 更新纵向高度和坐标currentY += offsetYprevX = x}// 处理最后一段到终点E的区间finalInterval := E - prevXsum += int64(finalInterval * currentY)// 输出结果fmt.Println(sum)
}

代码详细解析

  1. 输入初始化

    scanner := bufio.NewScanner(os.Stdin)
    
    • 使用 bufio.Scanner 读取标准输入。
  2. 读取首行数据

    scanner.Scan()
    firstLine := strings.Fields(scanner.Text())
    N, _ := strconv.Atoi(firstLine[0])
    E, _ := strconv.Atoi(firstLine[1])
    
    • 解析首行输入,分割为 N(指令数)和 E(终点坐标)。
  3. 变量初始化

    prevX := 0    // 初始横坐标为0(原点)
    currentY := 0 // 初始纵向高度为0
    sum := int64(0) // 总面积初始化为0,用int64防止溢出
    
  4. 循环处理每个指令点

    for i := 0; i < N; i++ {scanner.Scan()line := strings.Fields(scanner.Text())x, _ := strconv.Atoi(line[0])offsetY, _ := strconv.Atoi(line[1])
    
    • 逐行读取指令点,解析横坐标 x 和偏移量 offsetY
  5. 计算区间面积

    interval := x - prevX
    sum += int64(interval * currentY)
    
    • 计算当前区间的横向长度 interval,面积累加到 sum
  6. 更新高度和坐标

    currentY += offsetY
    prevX = x
    
    • 调整纵向高度 currentY,更新前一个横坐标 prevX
  7. 处理最后一段到终点E的区间

    finalInterval := E - prevX
    sum += int64(finalInterval * currentY)
    
    • 计算最后一段的长度,并累加其面积。
  8. 输出结果

    fmt.Println(sum)
    

示例测试

示例1输入:
4 10  
1 1  
2 1  
3 1  
4 -2  

输出

12  

解析

  • 区间面积依次为:[0,1)=0[1,2)=1×1=1[2,3)=1×2=2[3,4)=1×3=3[4,10)=6×1=6,总和 12
示例2输入:
2 5  
1 2  
3 3  

输出

14  

解析

  • 区间面积:[0,1)=0[1,3)=2×2=4[3,5)=2×5=10,总和 14
示例3输入:
1 5  
5 3  

输出

0  

解析

  • 区间 [0,5) 面积为 5×0=0,最后区间 [5,5) 长度为0,总和为 0

综合分析

  1. 时间复杂度O(N)

    • 遍历所有指令点一次,时间复杂度与指令数 N 成线性关系。
  2. 空间复杂度O(1)

    • 仅需常量级变量存储当前状态,无需额外存储所有指令点。
  3. 优势

    • 高效处理:逐个指令点处理,避免内存浪费。
    • 抗溢出:使用 int64 确保大数计算正确。
    • 逻辑清晰:严格按题目描述逐段计算,无冗余操作。
  4. 适用场景

    • 适用于指令数极大(如 N=1e4)或终点坐标极大(如 E=2e4)的场景。

更多内容:

https://www.kdocs.cn/l/cvk0eoGYucWA

本文发表于【纪元A梦】,关注我,获取更多实用教程/资源!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Python(selenium) 的百度新闻定向爬虫:根据输入的关键词在百度新闻上进行搜索,并爬取新闻详情页的内容

该项目能够根据输入的关键词在百度新闻上进行搜索,并爬取新闻详情页的内容。 一、项目准备 1. 开发环境配置 操作系统:支持 Windows、macOS、Linux 等主流操作系统,本文以 Windows 为例进行说明。Python 版本:建议使用 Python 3.8 及以上版本,以确保代码的兼容性和性能。…

MySQL表的操作 -- 表的增删改查

目录 1. 表的创建2. 表的查看3. 表的修改4. 表的删除5. 总结 1. 表的创建 1.查看字符集及效验规则 2. 表的创建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;创建用户表1 创建用…

如何解决极狐GitLab 合并冲突?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 合并冲突 (BASIC ALL) 合并冲突发生在合并请求的两个分支&#xff08;源分支和目标分支&#xff09;对相同代码行进行了不同…

oracle不同数据库版本的自增序列

-- 查看数据库版本 SELECT * FROM v$version WHERE banner LIKE Oracle%; 1. Oracle 12c及以上版本支持 id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY, -- 语法 id NUMBER GENER…

VIC-3D非接触全场应变测量系统用于小尺寸测量之电子元器件篇—研索仪器DIC数字图像相关技术

在5G通信、新能源汽车电子、高密度集成电路快速迭代的今天&#xff0c;电子元件的尺寸及连接工艺已进入亚毫米级竞争阶段&#xff0c;这种小尺寸下的力学性能评估对测量方式的精度有更高的要求&#xff0c;但传统应变测量手段常因空间尺寸限制及分辨率不足难以捕捉真实形变场。…

pod 创建私有库指南

步骤 参考&#xff1a;iOS Pod 私有库创建指南-百度开发者中心 下面主要是对参考链接里面的解释&#xff1a; 创建两个仓库&#xff1a; 一个叫podframe.git&#xff0c;用来存放自定义的framework&#xff0c;比如TestPodFrame.framework一个叫podspec.git&#xff0c;用来…

【JavaEE】Spring AOP的注解实现

目录 一、AOP 与 Spring AOP二、Spring AOP简单实现三、详解Spring AOP3.1 Spring AOP 核心概念3.1.1 切点&#xff08;Pointcut&#xff09;3.1.2 连接点&#xff08;Join Point&#xff09;3.1.3 通知&#xff08;Advice&#xff09;3.1.4 切面&#xff08;Aspect&#xff09…

协作开发攻略:Git全面使用指南 — 结语

协作开发攻略&#xff1a;Git全面使用指南 — 结语 Git 是一种分布式版本控制系统&#xff0c;用于跟踪文件和目录的变更。它能帮助开发者有效管理代码版本&#xff0c;支持多人协作开发&#xff0c;方便代码合并与冲突解决&#xff0c;广泛应用于软件开发领域。 文中内容仅限技…

如何用AI主动突出画面主体!涂鸦新方案助剪辑、工业巡检、医疗影像等领域,实现自动追踪+智能放大

随着智能 IPC 设备&#xff08;如安防摄像头、宠物陪伴机器人、婴儿监视器等&#xff09;日益普及&#xff0c;越来越多的生活场景被实时记录。然而在实际使用中&#xff0c;由于设备安装位置不当、广角镜头视野过大等原因&#xff0c;经常会出现拍摄主体占比过小的问题&#x…

数据湖DataLake和传统数据仓库Datawarehouse的主要区别是什么?优缺点是什么?

数据湖和传统数据仓库的主要区别 以下是数据湖和传统数据仓库的主要区别&#xff0c;以表格形式展示&#xff1a; 特性数据湖传统数据仓库数据类型支持结构化、半结构化及非结构化数据主要处理结构化数据架构设计扁平化架构&#xff0c;所有数据存储在一个大的“池”中多层架…

当智驾成标配,车企暗战升级|2025上海车展

文&#xff5c;刘俊宏 编&#xff5c;王一粟 智能化无处不在的2025年上海车展&#xff0c;回归了卖车的初衷。 光锥智能在展会暴走两天&#xff0c;最大的感触是今年的车展少了争奇斗艳&#xff0c;多了些许务实。 回顾智能汽车时代的三场重要车展。2023年的上海车展充满了…

如何在Spring Boot中禁用Actuator端点安全性

在 Spring Boot 应用中&#xff0c;Spring Boot Actuator 提供了一系列用于监控和管理应用的端点&#xff08;如 /actuator/health、/actuator/metrics&#xff09;&#xff0c;这些端点默认可能受到 Spring Security 的保护&#xff0c;要求身份验证或授权。然而&#xff0c;在…

【mongodb】系统保留的数据库名

目录 1. admin2. config3. local4. test&#xff08;非严格保留&#xff0c;但常作为默认测试数据库&#xff09;5. 注意事项6. 其他相关说明 1. admin 1.用途&#xff1a;用于存储数据库的权限和用户管理相关数据。2.特点&#xff1a;该数据库是 MongoDB 的超级用户数据库&am…

Redis是单线程的,如何提高多核CPU的利用率?

一句话回答&#xff1a; Redis 是单线程处理客户端命令&#xff0c;但可以通过 多实例部署、I/O 多路复用、后台线程 Redis 6 的 I/O Thread 支持&#xff0c;来充分利用多核 CPU。 一、Redis 单线程 ≠ 整个 Redis 都是单线程&#xff01; Redis 主要的 网络事件 命令执行 …

关于mysql的事务和索引

1. 事务四大特性&#xff08;ACID&#xff09; 原子性&#xff1a;事务的操作要么全部成功&#xff0c;要么全部失败回滚&#xff0c;不可分割。 一致性&#xff1a;事务执行前后&#xff0c;数据必须满足业务规则&#xff08;如账户总额不变&#xff09;。 隔离性&#xff1…

【Python】保持Selenium稳定爬取的方法(防检测策略)

selenium 防检测策略的方法汇总&#xff1a; 合理设置延迟&#xff1a;请求间添加随机延迟 (2-10秒) 限制爬取频率&#xff1a;控制每小时/每天的请求量 轮换用户代理&#xff1a;准备至少10个不同的User-Agent 使用住宅代理&#xff1a;优先选择高质量的住宅代理IP 处理验…

SpringSecurity源码解读AbstractAuthenticationProcessingFilter

一、介绍 AbstractAuthenticationProcessingFilter 是 Spring Security 框架里的一个抽象过滤器,它在处理基于表单的认证等认证流程时起着关键作用。它继承自 GenericFilterBean,并实现了 javax.servlet.Filter 接口。此过滤器的主要功能是拦截客户端发送的认证请求,对请求…

什么是DDD?为什么它正在取代传统架构?

什么是DDD&#xff1f;为什么它正在取代传统架构&#xff1f; 1. 传统开发模式的痛点 在经典的MVC架构中&#xff0c;开发流程往往从数据库表结构设计开始&#xff0c;业务逻辑散落在Service层&#xff0c;随着需求迭代容易形成「大泥球」代码&#xff1a; 实体类变成纯粹的…

基于外部中中断机制,实现以下功能: 1.按键1,按下和释放后,点亮LED 2.按键2,按下和释放后,熄灭LED 3.按键3,按下和释放后,使得LED闪烁

题目&#xff1a; 参照外部中断的原理和代码示例,再结合之前已经实现的按键切换LED状态的实验&#xff0c;用外部中断改进其实现。 请自行参考文档《中断》当中&#xff0c;有关按键切换LED状态的内容, 自行连接电路图&#xff0c;基于外部中断机制&#xff0c;实现以下功能&am…

在SQL中,FROM子句中的子查询必须指定别名,即使后续未引用该别名

FROM子句中的子查询必须指定别名 示例错误示例及原因&#xff1a;总结&#xff1a; 在SQL中&#xff0c; FROM子句中的子查询必须指定别名&#xff0c; 即使后续未引用该别名 示例 查询馆藏图书最多的作者姓名及馆藏数量 SELECT 作者, COUNT(图书编号) AS 馆藏数量 FROM 图…