【模板】差分

news/2024/9/22 15:10:00/

本题链接:登录—专业IT笔试面试备考平台_牛客网

题目:

样例:

输入
3 2
1 2 3
1 2 4
3 3 -2
输出
5 6 1

思路:

        一直以来,我总是不太理解差分和树状数组操作区别。

        现在摸了一下开始有所理解了。

        差分和树状数组的区别:

        树状数组:可以边区间插入操作边查询。

        差分:一系列区间操作后,最后确定结果序列

        

差分原理:


原数组为 a
差分数组为 b
前缀和数组为 c

这里要注意的是,操作差分的时候,+x 前后的关系
差分 就是 差分数组的前缀和 = 原数组相应位置的前缀和
例如:
b1 = a1 - 0
b2 = a2 - a1
b3 = a3 - a2

b1 + b2 + b3 = c3c3 = a1 + a2 + a3

所以相应关系后,操作差分数组函数如下,理解相应核心内容:

初始时添加数值序列:

for(int i = 1,x;i <= n;++i)
{cin >> x;Insert(i,i,x);
}

区间添加修改函数:

inline void Insert(int l, int r, int x)
{a[l] += x;          // 前缀和 a[l] += x;a[r + 1] -= x;      // 区间 a[r] 因为前面 +x 了,所以要维持差分前缀和不变,所以 r+1 -= x
}

获取最终操作结果序列函数:

inline void getArray()
{for (int i = 1; i <= n; ++i)        // 最后求 差分的前缀和{a[i] += a[i - 1];               // 差分的前缀和,就是相应原数组操作后的前缀和}
}

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
inline void solve();signed main()
{
//	freopen("a.txt", "r", stdin);IOS;int _t = 1;
//	cin >> _t;while (_t--){solve();}return 0;
}
int n,q,a[N];inline void Insert(int l,int r,int x)
{a[l] += x;a[r + 1] -= x;
}
inline void getArray()
{for(int i = 1;i <= n;++i){a[i] += a[i - 1];}
}
inline void solve()
{cin >> n >> q;for(int i = 1,x;i <= n;++i){cin >> x;Insert(i,i,x);	// 初始插入序列}while(q--){int l,r,x;cin >> l >> r >> x;Insert(l,r,x);	// 区间修改}getArray();	// 获取最后系列操作后结果序列for(int i = 1;i <= n;++i) cout << a[i] << ' ';
}

最后提交:


http://www.ppmy.cn/news/1428429.html

相关文章

OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析

摘要&#xff1a;本文简单介绍如何编写第一个hello world程序&#xff0c;以及程序是被执行的 适合群体&#xff1a;适用于Hi3861开发板&#xff0c;启动流程分析 4.1编写第一个程序 编写一个hello world程序比较简单&#xff0c;可以参考官网&#xff1a; https://gitee.c…

word批量修改表格样式

利用宏&#xff0c;批量选中表格&#xff0c;然后利用段落和表设计来操作。 利用宏&#xff0c;批量选中表格&#xff0c;参考百度安全验证段落&#xff0c;表格里面的内容有空格&#xff0c;应该是有缩进&#xff0c;在段落中去掉缩进&#xff0c;即缩进-特殊&#xff0c;选择…

《论文阅读》对话推理的对比学习 EMNLP 2023

《论文阅读》对话推理的对比学习 前言名词简介CICERO 数据集方法损失函数实验结果前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Contrastive Learning for Inference in Dialogue》 出版:EMNLP 时…

算法 第46天 动态规划8

139 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 输入: s “leetcode”, wordDict [“…

黑客知识了解

ipc$ 利用139&#xff0c;445端口 弱口令&#xff1a;admin,123456,root 容易被破解 命令 内部命令&#xff08;系统自带命令&#xff09; dir,tree,notepad 外部命令&#xff08;你自己下载的命令&#xff09; python webshell 网页木马 SQL注入 sql 结构化查询语言 …

论文笔记:UrbanGPT: Spatio-Temporal Large Language Models

1 intro 时空预测的目标是预测并洞察城市环境随时间和空间不断变化的动态。其目的是预见城市生活多个方面的未来模式、趋势和事件&#xff0c;包括交通、人口流动和犯罪率。虽然已有许多努力致力于开发神经网络技术&#xff0c;以准确预测时空数据&#xff0c;但重要的是要注意…

Ubuntu 微调训练ChatGLM3大语言模型

Ubuntu 微调训练ChatGLM3大语言模型 LLaMA Factory 的 LoRA 微调提供了 3.7 倍的加速比&#xff0c;同时在广告文案生成任务上取得了更高的 Rouge 分数。结合 4 比特量化技术&#xff0c;LLaMA Factory 的 QLoRA 微调进一步降低了 GPU 显存消耗。 https://github.com/hiyouga…

Golang汇编之通过map地址找到value的值

文章目录 背景gdb调试Go程序为什么不用dlvgdb调试Go可执行程序gdb打印地址内容 go汇编快速入门常用的寄存器和用法AMD64ARM64loong64riscv64 Go汇编常用命令及含义Go汇编和x86的区别找到map的赋值指令 Go中map的内存布局gdb中查看map结构map的存储结构map的内存布局计算bmap偏移…