差分详解+树状数组扩展
发布日期:2021-06-30 10:13:21
浏览次数:3
分类:技术文章
本文共 893 字,大约阅读时间需要 2 分钟。
前言:现在还不是很懂,不过先把模板抄在这里把。
介绍一下差分,一个很简单的东西。 一、简介 已知数组a为1,2,1,5,7,4 那么差分数组1,1,-1,4,2,-3 显然,差分数组就是当前项与前一项的差值。 容易得到,an就是差分数组的前n项和。 二、那么有什么便利的地方呢? 我们假想一下,现在要给1至4的区间每个数加上1,那么差分数组会变成什么样呢,模拟一下得 a数组2,3,2,6,8,5 差分数组2,1,-1,4,1,-3 可以看到,只有下标为1和5的地方发生了变化。 刚才我们说到,差分数组的前n项和就是an,那我们在差分数组的1处加1,在5处减1,那么1到4利用差分数组前缀和求an,an的值确实都加了1,当我们求a5以后的数的话,我们就不需要加1了,所以差分数组a5处减1. 这样,差分数组的前缀和仍然是an。树状数组+差分
#includeusing namespace std;typedef long long ll;ll n,m,tree[500009];ll lowbit(ll x){ return x&(-x);}ll sumn(ll x){ ll ans=0; while(x>0){ ans+=tree[x]; x-=lowbit(x); } return ans;}void add(ll x,ll w){ while(x<=n){ tree[x]+=w; x+=lowbit(x); }}int main(){ cin>>n>>m; ll last=0,nows=0; for(int i=1;i<=n;i++) { scanf("%ld",&nows); add(i,nows-last); last=nows; } for(int i=1;i<=m;i++) { ll mid,l,r,q; cin>>mid; if(mid==1) { cin>>l>>r>>q; add(l,q); add(r+1,-q); } else { cin>>l; cout< <
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/104467197 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月20日 00时54分30秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
pip简单命令
2019-04-30
Python自动化操作Excel表格
2019-04-30
openssl 实现https 网站
2019-04-30
SQLite3日期与时间,常见函数
2019-04-30
sql 添加时间段内随机时间
2019-04-30
十一、打印和打印机设置函数
2019-04-30
十二、注册表操作函数
2019-04-30
C++的除法需要留意的几点情况
2019-04-30
C++打印三角形、四边形
2019-04-30
C++程序的基本组成简介
2019-04-30
JavaScript变量及访问方式介绍
2019-04-30
centos7 hbase1.4.13+hadoop2.7.1+单机环境搭建
2019-04-30
HDP+ambari安装
2019-04-30
140行代码自己动手用python写一个词云制作小工具
2019-04-30
数据挖掘 | 利用python进行商品亲和性分析
2019-04-30
80行代码自己动手用python写一个表格拆分与合并小工具
2019-04-30
pytorch之tensor
2019-04-30
判断图同构大杀器---nauty算法
2019-04-30
为什么有时候python代码不能左对齐
2019-04-30
python中保存一个数组,你会吗?
2019-04-30