树状数组 区间更新(利用了伪线段树) + poj3468题解

快速上手springboot+vue的前后端分离项目 使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。 阅读详情

废话不多说 先粘代码 以poj3468为例

A Simple Problem with Integers
Time Limit: 5000MS		Memory Limit: 131072K
Total Submissions: 123915		Accepted: 38431
Case Time Limit: 2000MS
Description

You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output

4
55
9
15
Hint

The sums may exceed the range of 32-bit integers.
Source

POJ Monthly--2007.11.25, Yang Yi
//区间更新

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>

using namespace std;
const int N=5e5+10;
long long sum[N];//前缀和树状数组
long long a[N];
long long n,m;
long long ddd[N];//加数树状数组



long long lowbit(long long t)
{
    return t&(-1*t);
}


void update(long long x,long long v, long long t[])
{
//给x的起始位置加v 并更新k数组
    for(int i=x; i<=n; i+=lowbit(i))
    {
        t[i]+=v;
    }
}

long long  getsum(long long x, long long t[])
{
//求k数组第i个前缀和
    long long  ans=0;
    for(int i=x; i>0; i-=lowbit(i))
        ans+=t[i];
    return ans;
}

void refresh_range(long long i,long long j, long long aa)
{
//给区间i~j中的所有元素加aa,更新对应的前缀和树状数组和加数树状数组
    update(i,-(i-1)*aa,sum);
    update(i,aa,ddd);
    update(j+1,j*aa,sum);
    update(j+1,-1*aa,ddd);
}

 long long range_sum(long long i,long long j)
{
//求i~j的区间和
     long long ans=0;
    ans+=getsum(j,sum)+getsum(j,ddd)*j;
    ans-=getsum(i-1,sum)+getsum(i-1,ddd)*(i-1);
    return ans;
}

int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>m&&n)
    {
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
            refresh_range(i,i,a[i]);
        }
 char s;
        for(int i=1;i<=m;i++)
        {


            cin>>s;
            if(s=='C')
            {
                long long x,y,z;
                cin>>x>>y>>z;
                if(x>y)
                    swap(x,y);
                refresh_range(x,y,z);
            }
            else if(s=='Q')
            {
                long long x,y;
                cin>>x>>y;
                if(x>y)
                    swap(x,y);
                cout<<range_sum(x,y)<<endl;
            }
        }
    }
    return 0;
}

我们知道,在单点更新的时候,对一个位置 x 的值加 a 时,位置在 x 之前的所有前缀和都是没有影响的,受影响的是从 x 开始之后的所有位置的前缀和。

利用单点更新和区间查询进行区间更新和单点查询,,在 x < i 和 x > j 的范围内(待更新区间之外),只要区间更新的加数 a 确定,这些前缀和便是固定值,不需要知道单点查询时候的位置,因此这部分工作可以在更新的时候实现,具体如何实现呢?

我们发现 在i <= x <= j 时,前缀和增量 y = (x-i+1)a = xa -(i-1)*a ;在 x > j 时,前缀和增量 y = (j - i +1 )a = ja - (i-1)*a ; 由此可以得出结论,在 x >= i 时,y 的表达式中均包含 -(i-1)a ,所以根据前缀和的规律,我们利用单点更新将此值加在 i 位置的前缀和上,则可以达到给 x >= i 范围内的所有前缀和均加上了此值。在 i <= x <= j 的区间范围内,我们发现前缀和增量表达式 y 除 -(i-1)a 这部分外,剩余的部分为 xa ,x 即为单点查询的位置,这个值不确定,只有在某一次查询的时候才能被确定,因此,这个操作需要在单点查询的时候完成。在 x > j 的范围内,前缀和表达式 y = ja - (i-1)a , 除已经在 x = i 的位置处理的 -(i-1)a 这部分之外,剩余部分为 ja ,这部分值只与区间更新的端点和更新的加数 a 有关,因此可以在更新时候处理,这时候我们需要将 j+1 位置的前缀和由 sum[ j+1 ] 更新为 sum[ j+1] + ja 。至此,除了查询 i <= x <= j 范围的值不正确之外,其余值都能够保证正确性。

当单点查询的位置 x 在 i~j 范围内的时候,我们需要在 x 的位置 单点更新前缀和 sum[ x ] 为 sum[x] +x*a 。现在,我们已经将三个区间都处理结束了,对吗?但是,这是真的结束吗? 大家是否还记得单点更新的操作?操作是这样的:在单点更新的时候,对一个位置 x 的值加 a 时,位置在 x 之前的所有前缀和都是没有影响的,受影响的是从 x 开始之后的所有位置的前缀和。这也就意味着当单点查询的位置 x 在 i~j 范围内的时候,我们对 x 位置的单点更新实际上已经影响到了我们在区间更新时候已经处理好的区间 x > j ,因此我们需要将此处因单点更新加的值 x*a 减去。这也就意味着,我们需要将加数 a 存储起来,否则,等到单点查询的时候,加数 a 都已经变成若干次区间查询后的加数了。但由于,同一个区间的加数多次叠加后,结果还是正确的。因此,我们可以仿照线段树时的 lazy_tag 想法存储每个节点对应的加数(线段树 lazy_tag//相当于ddd数组)。

对于某一个具体的加数该如何存储和维护呢?有了前面的分析思路,我们应该可以用两个树状数组分别存储前缀和与加数,其中一个树状数组 lazy_tag来存储加数,假设某次区间更新的范围为 i~j ,加数为 a ,我们需要做的操作为:

lazy_tag[i] += a ; //给 x >= i 的所有节点加数均加 a

lazy_tag[j+1] -= a ; // 给 x >j 的所有节点均减 a ,消除 i 位置处理的影响

这样,就能保证仅对 i ~j 范围内的加数加了 a ,以此配合区间更新时的操作保证所有前缀和的正确性。此处,对加数的处理和原问题(区间更新)处理思路是一样的,给某一区间的所有加数均加 a 的问题实质就是区间更新的问题。因此此处,某一位置 x 的加数不是 ddd[x] 的值,而是 ddd 树状数组的第 x 位置前缀和。

【ARM CoreLink 系列 3 -- CCI-550 控制器介绍 】 Arm CoreLink CCI-550 Cache Coherent Interconnect 扩展了 CoreLink CCI-500。它在 big.LITTLE 处理器集群之间提供完整的缓存一致性,并为其他代理(如 Mali GPU、网络接口或加速器)提供 I/O 一致性。CoreLink CCI-550 提供可扩展和可配置的互连,使 SoC 设计人员能够以尽可能小的面积和功耗满足性能目标,并且还增加了可降低整体系统延迟的监听滤波器。 阅读详情

相关推荐

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3206

【数据结构】数组区间更新-IndexTree(树状数组)

在嵌段时间,我们介绍过线段树,线段树是解决在数组区间上进行快速的增删改查操作。而今天我们讲得IndexTree也是为了达到这样类似的效果。 一、介绍 例题:给定一个数组arr,arr的长度是1000,现在问你如何快速的计算500 ~ 1000之间,所有的数的累加和?? 可能你会说直接一个for循环,从500开始累加不就行了吗? 这样确实可以达到目的,但是还是不够快。 又或许,你会想到用前缀和数组,先计算每一个index,从0下标一直累加到index位置。这样一个前缀和数组,也是能达到相应的效果。如下:

x0919的博客 1365

基于LabVIEW控制仪器检测与监控 --普源示波器DS1102Z-E

LabVIEW 控制普源示波器 代码实现与解释

s0101100的博客 4231

树状数组区间更新

树状数组区间更新 在今天的文章开始之前,给大家提一个建议,由于线段树和树状数组这两个结构的分析有很多联系,因此,建议没有看前几篇文章的朋友一定需要了解一下前面的内容。链接如下: 线段树+RMQ问题第二弹 线段树第二弹(区间更新) 树状数组(Binary Indexed Tree,BIT) 上篇文章我们讨论了树状数组的基本结构以及它最擅长的两个功能:单点更新...

weixin_33775572的博客 177

迫零均衡前与迫零均衡后眼图对比附Matlab代码

迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。

ByteSparkX的博客 459

多天线技术:5G波束成形&空间复用&空时编码

以提升信号的可靠性。然而,在20世纪90年代中期,研究者们惊讶地发现,多天线技术不仅仅提供分集增益,还可以开启一些单天线系统无法实现的新机遇。,我们可以将信道矩阵 ( H ) 视为一个满秩矩阵,则理论上可以建立min(𝑁𝑇,𝑁𝑅)个独立的数据流,形成一个。波束成形是5G物理层的核心技术,其本质是利用多个天线来增强特定方向上的信号,同时抑制干扰方向的信号。:物理波束成形 = 🔦 类似手电筒的聚焦光束,虚拟波束成形 = 🌊 类似水波的相干叠加。随着 5G 和 6G 时代的到来,多天线技术的作用愈发重

weixin_43199439的博客 1389

树状数组(区间问题)

目录 一维树状数组 单点更新,区间查询 区间更新,单点查询 区间更新,区间查询 二维树状数组 单点更新,区间查询 区间更新,单点查询 区间更新,区间查询 区间最值 一维树状数组   单点更新,区间查询 #include &lt;iostream&gt; using namespace std; const int MAX_N=10010; int C[MAX_N]; ...

兜率工的博客 780

STM32入门教程:水位传感器应用

这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。

wx_linying1029的博客 533

树状数组的区间更新和区间查询

对于区间修改、区间查询这样的简单问题,打一大堆线段树确实是不划算,所以学习下区间查询+区间修改的树状数组   设原数组是a[n],差分数组c[n],c[i]=a[i]-a[i-1], 那么明显地a[i]=sigma (c[i]),如果想要修改a[i]到a[j](比如+v),只需令c[i]+=v,c[j+1]-=v   观察式子: a[1]+a[2]+...+a[n] = (c[1]) ...

ii0789789789的博客 1105

2025年CSP-X初赛真题及答案解析(江西)(完善程序第1题)

2025年CSP-X初赛真题及答案解析(江西)(完善程序第1题)

王老师青少年编程 713

ABAP Bits and Bytes 完全参考,理解内存、字节、位运算与类型解释

ABAP开发中业务代码与底层字节处理的差异:业务层关注采购订单、会计凭证等语义信息,而接口开发需处理十六进制、位运算等底层操作。文章通过整数变量示例说明同一段字节在不同类型解释下会呈现不同值,并介绍x类型、位运算及类型转换的实际应用。这些知识在文件接口、加密传输等场景中尤为重要,开发者需注意字节序、编码等问题。建议将底层协议处理与业务逻辑分离,以保持代码清晰和可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 141

POJ3468(树状数组区间更新和区间查询-线段树)

A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072K Total Submissions:151635 Accepted:...

Dog_dream的博客 731

【图像超分】论文复现:Pytorch实现SRCNN!保姆级复现教程!提供完整代码和最优权重模型(x2、x3、x4)!科研级论文曲线图!计算平均PSNR和SSIM!代码Windows和Linux都可用!

由于很多同学反应没用过jupyter notebook,更习惯用pycharm项目的形式跑代码。于是,本文将用pycharm项目的形式,重新复现SRCNN!【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4702

A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)

题意: 有一个数组,有两种操作。1: Q a b 求[a,b]的和 2:C a b c 给[a,b] 的所有元素都加上c。 题目: You haveNintegers,A1,A2, ... ,AN. You need to deal with two kinds of operations. One type of operation is to add some given nu...

zeng_jun_yv的博客 307

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

POJ 3468(树状数组的威力)

  之前说过这是线段树的裸题,但是当看了http://kenby.iteye.com/blog/962159这篇题解后我简直震惊了,竟然能如此巧妙地转化为用树状数组来处理,附上部分截图(最好还是进入原网址细细品味): 依照他的思路附上我的代码: 1 #include<cstdio> 2 #include<cstring> 3 #defi...

aidiao7379的博客 193

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构笔记(5):线段树和树状数组模板

树状数组模板 struct fenwick { int* data; int n; fenwick(int _n) : n(_n) { data = new int[n]; for (int i = 0; i < n; i++) data[i] = 0; } ~fenwick() { delete[] data; } void add(int x) { while (x < n) {

gh6267的博客 268

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

POJ3468树状数组/线段树

树状数组: 介绍: 这里讲的很详细…… 还有这里。 题解: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 typedef long long ll; 6 const int MAXN = 100000; 7 int N; 8 l...

banzuke3318的博客 228

线段树&树状数组&扫描线

树状数组 :http://blog.youkuaiyun.com/int64ago/article/details/7429868 树状数组求最值:http://blog.youkuaiyun.com/u010598215/article/details/48206959 线段树:http://www.cnblogs.com/TenosDoIt/p/3453089.html ZKW线段树 :http://www.c

far away 526

ACM 线段树,树状数组入门题(附代码解释)

如果是初学者建议先看看这篇博客,写的很不错传送门 目录 HDU 1166 敌兵布阵(线段树) HDU 1698 Just a Hook(线段树) POJ 3468 A Simple Problem with Integers(线段树区间修改+求和) HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P3372 【模板】线段树 1 洛谷 P3373 【模板...

不二君 848

(转)POJ 3468 A Simple Problem with Integers --- 树状数组延迟标记

题意: 有一个数组,有两种操作。1: Q a b 求[a,b]的和 2:C a b c 给[a,b] 的所有元素都加上c。 题目: You haveNintegers,A1,A2, ... ,AN. You need to deal with two kinds of operations. One type of operation is to add some given numb...

。 265

POJ 3468 A Simple Problem with Integers (树状数组成段更新)

Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operations. One type of operation is to add a given number to a few numbers in a given interval. The other is to query the value of some element.

HJY 417

poj 3468 A Simple Problem with Integers 线段树/树状数组

题目 题目链接:http://poj.org/problem?id=3468 题目来源:《挑战》例题。 简要题意:区间内数全加上某数或者求区间内的和。

ned_chu的博客 470

POJ 3468 树状数组

题目You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the s

仰望天空 381

POJ 3468 A Simple Problem with Integers(线段树 or 树状数组—区间求和,成段更新)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 81443   Accepted: 25160 Case Time Limit: 2000MS Description You have N i

Chunzhen的博客 529

从模块需求到引脚分配:嵌入式面包板接线逻辑全解析

在嵌入式硬件开发中,接线并非简单的照图插线,而是需要一套从模块需求推导到芯片资源分配的工程逻辑。任何模块的引脚本质可归结为电源、通信与控制三类需求,理解供电电压、电平匹配与信号交叉是基础前提;主控芯片的引脚复用与资源冲突则是接线规划的核心约束。结合NEO-M8N GPS模块与STC8G1K08A单片机的典型组合,文章系统讲解了如何拆解接口需求、分配有限引脚、规避烧录口冲突,并分析面包板上的供电轨结构、去耦电容与信号完整性等物理细节。从万用表测压到逻辑分析仪观测波形,还给出了从电源排查到资源冲突识别的完整排错

weixin_33768481的博客 120

树状数组的基本用法(板子)

写这篇博客,为了方便自己后续复制粘贴板子; HDU 1166 题意:单点查询,区间更新 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 6 #define lowbit(x) ((x)&...

113
上一篇: 博弈
下一篇: Codefroces 916A Jamie and Alarm Snooze
Puppet__
博客等级 码龄9年 319粉丝 328原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值