AcWing1维差分

news2024/11/18 8:51:30

在这里插入图片描述

输入数据a数组

a[i]a0a1a2 … \dots an
b[i]b0b1b2 … \dots bn

b1=a1
b2=a2-a1
… \dots
bn=an-an-1
以上各式累加相消得到
b1+b2+ … \dots +bn=an
也就是说任一an可以由b数组累加求和得到并且任一个bi加上元素c等于在an上面+c。
对于区间[L,R],
aL=b1+b2+ … \dots +bL
aL+1=b1+b2+ … \dots +bL+bL+1
… \dots
aR=b1+b2+ … \dots +bR-1+bR

在bL=bL+c之后(也就是说bL增加c后)有
aL+c=b1+b2+ … \dots +bL+c
aL+1+c=b1+b2+ … \dots +(bL+c)+bL+1
… \dots
aR+c=b1+b2+ … \dots +(bL+c)+ … \dots +bR-1+bR

a L ′ = a L + c a^{'}_{L}=a_L+c aL=aL+c,
a L + 1 ′ = a L + 1 + c a^{'}_{L+1}=a_{L+1}+c aL+1=aL+1+c
… \dots
a R ′ = a R + c a^{'}_{R}=a_{R}+c aR=aR+c
(‘令’的操作可以把他看成一个整体)
替换上式
a L ′ a^{'}_{L} aL=b1+b2+ … \dots +bL+c
a L + 1 ′ a^{'}_{L+1} aL+1=b1+b2+ … \dots +(bL+c)+bL+1
… \dots
a R ′ a^{'}_{R} aR=b1+b2+ … \dots +(bL+c)+ … \dots +bR-1+bR
因此在b数组上面任一位置 i i i加一个c,会影响到[i,end]的a数组,因为 ∑ 1 i b i \sum^{i}_{1} b_i 1ibi累加得到 a i a_i ai,b的[begin,end]任一位置 i i i+c,会导致[i,end]的a全部+c
然后如果要实现只在[L,R]内+c,那么需要在b[L]+=c,b[R+1]-=c,这样操作以后先是[L,R][R+1,end]全部元素+c,然后[R+1,end]全部元素-c
然后[R+1,end]+c又-c就是没有变化,只有[L,R]+c了。
最后把b数组用O(n)循环
(记住:an=b1+b2+ … \dots +bn

for(int i=1;i<=n;++i)
{
   b[i]+=b[i-1];
   cout<<b[i]<<" ";
}

就可以用b数组元素表示增加c后的a数组元素!
然后挨个输出b[i]就好啦!

#include<iostream>
#define N 100086
using namespace std;
int n,m,l,r,c,a[N],b[N];
void insert(int l,int r,int c){
    b[l]+=c;
    b[r+1]-=c;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;++i) cin>>a[i];
    for(int i=1;i<=n;++i) insert(i,i,a[i]);
    	//b[i]=a[i]-a[i-1];
    for(int i=1;i<=m;++i) {
        cin>>l>>r>>c;
        insert(l,r,c);
    }
    for(int i=1;i<=n;++i)
    {
        b[i]+=b[i-1];
        cout<<b[i]<<" ";
    }
    cout<<endl;
    
    return 0;
}

代码中有insert(i,i,a[i]);,我们如何理解呢?这里就只能死记硬背了,因为这代码

    for(int i=1;i<=n;++i) 
        insert(i,i,a[i]);

和直接根据差分公式算出来的是完全一样的!这个确实是太巧妙了!

    for(int i=1;i<=n;++i) 
        b[i]=a[i]-a[i-1];

是可以AC通过的
刚开始a和b全是0,
a 0 = 0 b 0 = 0 a_0=0 \\ b_0=0 a0=0b0=0

iinsert(i,i,a[i])b[i]=a[i]-a[i-1];
i=1 b 1 + = a 1 = > b 1 = b 1 + a 1 = 0 + a 1 = a 1 b 2 − = a 1 = > b 2 = b 2 − a 1 = 0 − a 1 = − a 1 b_1+=a_1=>b_1=b_1+a_1=0+a_1=a_1 \\ b_2-=a_1=>b_2=b_2-a_1=0-a_1=-a_1 b1+=a1=>b1=b1+a1=0+a1=a1b2=a1=>b2=b2a1=0a1=a1 b 1 = a 1 − a 0 = a 1 b_1=a_1-a_0=a_1 b1=a1a0=a1
i=2 b 2 + = a 2 = > b 2 = b 2 + a 2 = − a 1 + a 2 = a 2 − a 1 b 3 − = a 2 = > b 3 = b 3 − a 2 = 0 − a 2 = − a 2 b_2+=a_2=>b_2=b_2+a_2=-a_1+a_2=a_2-a_1 \\ b_3-=a_2=>b_3=b_3-a_2=0-a_2=-a_2 b2+=a2=>b2=b2+a2=a1+a2=a2a1b3=a2=>b3=b3a2=0a2=a2 b 2 = a 2 − a 1 b_2=a_2-a_1 b2=a2a1
i=3 b 3 + = a 3 = > b 3 = b 3 + a 3 = − a 2 + a 3 = a 3 − a 2 b_3+=a_3=>b_3=b_3+a_3=-a_2+a_3=a_3-a_2 b3+=a3=>b3=b3+a3=a2+a3=a3a2 b 3 = a 3 − a 2 b_3=a_3-a_2 b3=a3a2
… \dots … \dots … \dots
i=n b n + = a n = > b n = b n + a n = − a n − 1 + a n = a n − a n − 1 b_n+=a_n=>b_n=b_n+a_n=-a_{n-1}+a_n=a_n-a_{n-1} bn+=an=>bn=bn+an=an1+an=anan1 b n = a n − a n − 1 b_n=a_n-a_{n-1} bn=anan1

经过推导证明,发现这俩完全一样,可以互相替换!
后面又仔细想了一下,发现相似点了
对于上次循环 i = k i=k i=k,

b k = b k + a k b k + 1 = b k + 1 − a k = − a k i = k + 1 b k + 1 = b k + 1 + a k + 1 = a k + 1 − a k b_k=b_k+a_k \\ b_{k+1}=b_{k+1}-a_k=-a_{k} \\ i=k+1\\ b_{k+1}=b_{k+1}+a_{k+1}=a_{k+1}-a_k bk=bk+akbk+1=bk+1ak=aki=k+1bk+1=bk+1+ak+1=ak+1ak
推导结果和b[i]=a[i]-a[i-1];完全一样啊!这就是差分公式!

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

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

相关文章

【短视频矩阵系统源码如何构建?】

在数字化时代&#xff0c;短视频已成为信息传播的重要载体。针对这一趋势&#xff0c;短视频矩阵系统的构建应运而生&#xff0c;集混剪、发布、数据分析及线索跟进于一体&#xff0c;旨在为内容创作者和品牌提供全方位的服务支持。 系统通过混剪功能&#xff0c;能够将长视频或…

接口测试 ★ ✔【接口测试理论、http协议、接口测试文档解析、Postman使用、接口测试用例设计、Request库、UnitTest框架、】

接口测试 接口测试-第01天&#xff08;接口测试理论、HTTP协议、接口测试流程、接口文档解析&#xff09;学习⽬标能够分析HTTP协议的请求和响应数据完成ihrm系统指定接⼝的API⽂档解析接⼝测试理论概念作用 ★实现⽅式 ★HTTP协议 ★HTTP协议简介URL格式 ★练习 HTTP请求 ★整…

A Comprehensive Study of Knowledge Editing for Large Language Models

大型语言模型&#xff08;LLMs&#xff09;在理解和生成与人类交流密切相关的文本方面表现出了非凡的能力。然而&#xff0c;一个主要的限制在于训练期间的大量计算需求&#xff0c;这是由于它们的广泛参数化而产生的。世界的动态性质进一步加剧了这一挑战&#xff0c;需要经常…

Java面试八股之Spring-boot-starter-parent的作用是什么

Spring-boot-starter-parent的作用是什么 spring-boot-starter-parent 是Spring Boot项目中的一个特殊POM&#xff08;Project Object Model&#xff09;&#xff0c;它主要的作用是提供一系列默认的配置和依赖管理&#xff0c;以便简化项目的构建过程。以下是spring-boot-sta…

【Python Web】Flask扩展开发指南

Flask是一个轻量级的Python Web框架&#xff0c;它提供了丰富的扩展库和工具&#xff0c;可以帮助开发者快速构建Web应用。本篇博客将介绍如何进行Flask扩展开发&#xff0c;包括扩展的创建、配置、使用等方面的内容。 目录 Flask扩展开发指南 一、Flask扩展简介 二、创建Fl…

java面向对象进阶进阶篇--《成员、静态、局部、匿名内部类》

个人主页→VON 收录专栏→java从入门到起飞 接口和接口与抽象类综合案例 目录 一、成员内部类 特性&#xff1a; 定义方式&#xff1a; 访问规则&#xff1a; 实例化&#xff1a; 生命周期&#xff1a; 静态成员&#xff1a; 使用场景&#xff1a; 示例&#xff1a; O…

快速入门了解Ajax

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Ajax的初识 意义&#xff1a;AJAX&#xff08;Asynchronous JavaScript and…

C语言 | Leetcode C语言题解之第287题寻找重复数

题目&#xff1a; 题解&#xff1a; int findDuplicate(int* nums, int numsSize){int *b(int*)calloc(100001,sizeof(int));for(int i0;i<numsSize;i){ b[nums[i]];if(b[nums[i]]2) return nums[i];}return 0;}

【C语言】 二叉树创建(结构体,先序遍历,中序遍历,后续遍历)

二叉树的创建&#xff1a;首先先定义一个结构体&#xff0c;里面包含数据&#xff08;data&#xff09;&#xff0c;指向左子树的指针&#xff08;L&#xff09;&#xff0c;指向右子树的指针&#xff08;R&#xff09;三个部分 在创建树的函数中&#xff0c;首先先输入…

内网对抗-隧道技术篇防火墙组策略HTTP反向SSH转发出网穿透CrossC2解决方案

知识点&#xff1a; 1、C2/C2上线-CrossC2插件-多系统平台支持 2、隧道技术篇-应用层-SSH协议-判断&封装&建立&穿透 3、隧道技术篇-应用层-HTTP协议-判断&封装&建立&穿透隧道技术主要解决网络通讯问题&#xff1a;遇到防火墙就用隧道技术&#xff0c;…

Mysql第五次作业 触发器和存储过程

1、建库建表 建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 建立触发器&#xff0c;实现功能:客户修改订单&#xff0c;商品…

Golang | Leetcode Golang题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; type PeekingIterator struct {iter *Iterator_hasNext bool_next int }func Constructor(iter *Iterator) *PeekingIterator {return &PeekingIterator{iter, iter.hasNext(), iter.next()} }func (it *PeekingIterator) hasNe…

鸿蒙应用框架开发【多HAP】程序框架

多HAP 介绍 本示例展示多HAP开发&#xff0c;简单介绍了多HAP的使用场景&#xff0c;应用包含了一个entry HAP和两个feature HAP&#xff0c;两个feature HAP分别提供了音频和视频播放组件&#xff0c;entry中使用了音频和视频播放组件。 三个模块需要安装三个hap包&#xff…

Milvus 向量数据库进阶系列丨部署形态选型

本系列文章介绍 在和社区小伙伴们交流的过程中&#xff0c;我们发现大家最关心的问题从来不是某个具体的功能如何使用&#xff0c;而是面对一个具体的实战场景时&#xff0c;如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

提交高通量测序处理数据到 GEO --- 操作流程

❝ 写在前面 由于最近在提交课题数据到 NCBI 数据库&#xff0c;整理了相关笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. 提交高通量测序数据到 GEO --- 说明书 2. 提交高通量测序原…

Hello SLAM(在Linux中实现第一个C++程序)

首先需要安装vim编辑器&#xff0c;输入命令 sudo apt install vim 在Ubuntu上安装好vim编辑器后&#xff0c;创建路径&#xff08;/home/slambook/ch2&#xff09;&#xff0c;在该路径下创建一个cpp文档&#xff08;touch hello.c&#xff09;&#xff0c;通过vim编辑器进行…

Docker安装kkFileView实现在线文件预览

kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 官方文档地址:https://kkview.cn/zh-cn/docs/production.html 一、拉取镜像 do…

MYSQL 第四次作业

任务要求&#xff1a; 具体操作&#xff1a; 新建数据库&#xff1a; mysql> CREATE DATABASE mydb15_indexstu; Query OK, 1 row affected (0.01 sec) mysql> USE mydb15_indexstu; Database changed 新建表&#xff1a; mysql> CREATE TABLE student( ->…

【人工智能】AI绘画:科技与艺术交汇的新时代

文章目录 &#x1f34a;AI绘画:开启艺术创作新纪元AI绘画技术发展&#xff1a;算法与艺术的完美交融AI绘画的工作原理与创意生成AI绘画的应用 AI绘画工具介绍 &#x1f34a;AI绘画:开启艺术创作新纪元 人工智能正以前所未有的力量重塑我们的世界&#xff0c;而AI绘画作为这股科…

Unity UGUI 之 事件接口

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是事件接口&…