当前位置: 首页 > news >正文

ZT21 【模板】差分

描述

对于给定的长度为 n 的数组{a1​,a2​,…,an​} ,我们有 m 次修改操作,每一次操作给出三个参数 l,r,k ,代表将数组中的 al​,al+1​,…,ar​ 都加上 k 。

请你直接输出全部操作完成后的数组。

输入描述:

第一行输入两个整数 n,m(1≦n,m≦10^5) 代表数组中的元素数量、操作次数。

第二行输入 n 个整数 a1​,a2​,…,an​(−10^9≦ai​≦10^9) 代表初始数组。

此后 m 行,每行输入三个整数 l,r,k(1≦l≦r≦n; −10^9≦k≦10^9) 代表一次操作。

输出描述:

在一行上输出 n 个整数,代表全部操作完成后的数组。

示例1

输入:

3 2
1 2 3
1 2 4
3 3 -2

输出:

5 6 1
一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.给定一个长度为n的数组,以及m次操作

2.每次操作有三个参数l,r,k,代表将数组中的al到ar(l和r表示下标)全都加上k的值

3.求m次操作后的数组每一项的值

二、解题思路

1.首先读取数据到long long数组a

2.然后读取m次操作到一个dp数组

3.读取的方式是,将dp[l] += x;

然后将dp[r + 1] -= x;

4.之后遍历dp数组,dp[i] += dp[i - 1];

每一项等于前一项和本项和。

5.最后我们遍历两个数组,输出结果结果是原数组a[i]加上dp[i]数组(dp数组记录了所有的区间增加和减少)

三、具体步骤

使用的语言是C

#include <stdio.h>
#define MAX_N 101010
#define ll long long
ll a[MAX_N];
ll dp[MAX_N];

int main() {
    int n, m, i;
    scanf("%d%d", &n, &m);
    for (i = 1; i <= n; i++) {
        scanf("%lld", &a[i]);
    }
    for (i = 1; i <= m; i++) {
        int l, r, x;
        scanf("%d%d%d", &l, &r, &x);
        dp[l] += x;
        dp[r + 1] -= x;
    }
    for (i = 1; i <= n; i++) {
        dp[i] += dp[i - 1];
    }
    for (i = 1; i <= n; i++) {
        printf("%lld ", a[i] + dp[i]);
    }
    return 0;
}

相关文章:

  • Python 面向对象编程-继承与多态
  • SyntaxError: positional argument follows keyword argument
  • CountDownLatch与CyclicBarrier使用及区别
  • Visual Studio Code集成MarsCode AI
  • 【Python 初级函数详解】—— 参数沙漠与作用域丛林的求生指南
  • 693. 交替位二进制数
  • ETL-kettle数据转换使用详解
  • 利用STM32TIM自制延迟函数实验
  • jeecgboot项目idea启动项目(二)
  • Java基础语法38(异常处理try-catch和throws)
  • 40岁开始学Java:避免创建不必要的对象
  • 分治算法+题目
  • 基金 word-->pdf图片模糊的解决方法
  • MyBatis调用外部静态方法
  • 飞致云开源社区月度动态报告(2025年2月)
  • 基于HTML的贪吃蛇小游戏
  • 目前主流 AI 大模型体系全解析:架构、特点与应用
  • 代码规范和简化标准
  • macos下myslq图形化工具之Sequel Ace
  • 记Android12上一个原生bug引起的system_server crash
  • 深圳做微信网站制作/seo百度发包工具
  • 网站对于企业的好处/360手机助手
  • 佛山电商网站制作团队/十大网络营销成功案例
  • 昆山做网站找文博/济南做网站建设的公司
  • 从做系统网站的收藏怎么找/想要推广网页
  • 九号线香网站建设/网络推广是网络营销的基础