[线段树] AcWing-245 你能回答这些问题吗

[DevExpress]GridControl拖拽行记录排序 DevExpress的GridControl拖拽行记录排序需求效果代码 需求 现在用户对按钮点击排序不满意了, 希望拖拽排序。 重载GridControl控件,对MouseMove、MouseDown、MouseUp事件修改一下。 效果 代码 using System; using System.Drawing; using System.Windows.Forms; using xiaoid.forms; using System.Data; using System.Collections.Gener 阅读详情

245. 你能回答这些问题吗

题目

        给定长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:

                1. 1 x y ,查询区间 \left [ x , y\right ] 中的最大连续子段和,即  \max_{x\leq l\leq r\leq y} {\sum_{i=l}^{r}A[i]} 。

                2. 2 x y , 把 A\left [ x \right ] 改成 y 。

         对于每个查询指令,输出一个整数表示答案。

思路

        这道题要求的是 区间查询 和 单点修改,每一次查询都是求最大连续区间和,鉴于我是在《算法竞赛进阶指南》的线段树篇看到的这个题目,所以我们使用 线段树 来求解这个问题。线段树使我们能够动态维护区间信息,但是我们依然需要想办法来让各个区间的最大连续区间和可以合并起来。

        我们使用正常的线段树建树方法来 Build 这个线段树,同时再维护4个信息:区间和 sum,区间最大连续子段和 val,从左端点开始的最大连续子段和 lsum,从右端点开始的最大连续子段和 rsum。

        在节点p是叶节点时,它的 sum, val, lsum, rsum 都相等,否则这个节点p的最大连续子段(val)和是下面三个值中最大的:节点p的左子树的最大连续子段和,节点p的右子树的最大连续子段和,节点p的左子树的最大连续右子段和(rsum)+右子树的连续最大左子段和(lsum)。

        在建立线段树时,我们需维护每个节点的区间和(sum),最大左子段和(lsum) 为这个节点的左子树的最大左子段和 或者 左子树的区间和(sum)和右子树的最大左子段和。最大右子段和(rsum)同理。

        查询线段树时,将符合条件的节点拿出,以是否在查询区间中 同时 是否能增大部分和为依据取舍答案节点,最后获得最终答案。

代码

#include <bits/stdc++.h>
using namespace std;

#define INF 0x3F3F3F3F
#define MAXN 5+500000

int n, m;
int a[MAXN];

struct Mem {
    int l, r;
    int sum, lsum, rsum, val;
} mem[MAXN*4];

void UpdateSegtree (int p) {
    mem[p].sum = mem[p*2].sum + mem[p*2+1].sum; //单纯区间和
    mem[p].lsum = max(mem[p*2].lsum, (mem[p*2].sum+mem[p*2+1].lsum)); //与最左端连接的部分的最大连续子段和
    mem[p].rsum = max((mem[p*2].rsum+mem[p*2+1].sum), mem[p*2+1].rsum); //与最右端连接的部分的最大连续子段和
    mem[p].val = max(max(mem[p*2].val, mem[p*2+1].val), (mem[p*2].rsum+mem[p*2+1].lsum)); //最大连续子段和:仅来自于一边,或者来自于左右两边的连接
}

void BuildSegtree (int p, int l, int r) { //建立线段树
    mem[p].l = l; mem[p].r = r;
    if (mem[p].l == mem[p].r) {
        mem[p].val = mem[p].sum = mem[p].rsum = mem[p].lsum = a[l];
        return;
    }
    int mid = (l+r)/2;
    BuildSegtree(p*2, l, mid);
    BuildSegtree(p*2+1, mid+1, r);
    UpdateSegtree(p);
}

Mem QuerySegtree (int p, int l, int r) {
    if (l<=mem[p].l && mem[p].r<=r) { return mem[p]; } //查询到这一次层时,如果包含了一个区域,那么这个区域严格包含在答案区间中,是答案的一部分
    Mem ans, tr, tl; //建立3个节点:ans为本层的答案节点,tr为右子树,tl为左子树
    tr.lsum = tr.rsum = tr.sum = tr.val = tl.lsum = tl.rsum = tl.sum = tl.val = -INF;
    ans.sum = 0;
    ans.lsum = ans.rsum = -INF;
    int mid = (mem[p].l+mem[p].r)/2;
    if (l <= mid) { //如果左子树包含在查询区间内
        tl = QuerySegtree(p*2, l, r);
        ans.sum += tl.sum; //ans需要向上传递,所以区间和需要计算
    }
    if (mid < r) {
        tr = QuerySegtree(p*2+1, l, r);
        ans.sum += tr.sum;
    }
    ans.val = max(max(tr.val, tl.val), (tl.rsum+tr.lsum));
    if (l <= mid) ans.lsum = max(tl.lsum, (tl.sum+tr.lsum)); //如果左子树包含在查询区间内,那么本层答案中的lsum就可以有两种选项
    else if (l > mid) ans.lsum = max(ans.lsum, tr.lsum); //否则只能是右子树的左最大子段和
    if (mid < r) ans.rsum = max(tr.rsum, (tr.sum+tl.rsum));
    else if (mid >= r) ans.rsum = max(ans.rsum, tl.rsum);
    return ans;
}

void PchangeSegtree (int p, int x, int v) { //单点修改
    if (mem[p].l == mem[p].r) {
        mem[p].val = mem[p].sum = mem[p].rsum = mem[p].lsum = v;
        return;
    }
    int mid = (mem[p].l+mem[p].r)/2;
    if (x <= mid) PchangeSegtree(p*2, x, v);
    else PchangeSegtree(p*2+1, x, v);
    UpdateSegtree(p); //注意维护性质
}

int main () {
    while (scanf("%d %d", &n, &m) != EOF) {
        for (int i=1; i<=n; i++) {
            scanf("%d", &a[i]);
        }
        BuildSegtree(1, 1, n);
        for (int i=0; i<m; i++) {
            int inp, l, r;
            scanf("%d %d %d", &inp, &l, &r);
            if (inp == 1) {
                if (l > r) swap(l, r);
                printf("%d\n", QuerySegtree(1, l, r).val);
            }
            else PchangeSegtree(1, l, r);
        }
        
    }
}
Docker 环境 Playwright MCP 部署全流程指南 Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬 阅读详情

相关推荐

PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)

该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用。实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改。 AXI_CDMA特性: 如果是使用ZYNQ 7系列芯片(可能其他Xilinx也是通用的),xilinx的AXI_CDMA 核有两种传输模式:轮询(poll)和中断(...

YGLeeeon的博客 3521

AcWing245. 你能回答这些问题吗 线段树详解

给一条序列,如何动态维护区间的最大子段和,包括询问某区间的最大字段和和修改某个数。

kai_wei_的博客 766

超详细!动态规划详解分析(典型例题分析和对比,附源码)

为啥要使用动态规划?什么时候使用动态规划?以下是我的一些理解和心得,如果你感兴趣,就接着往下看吧。 对您有帮助的话记得给我点个赞哟! 动态规划的基本思想 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。 动态规划算法与分治法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中 得到原有问题的解。与分治法不同的是,动态规划经分解后得到的子问题

qq_44398094的博客 8万+

AcWing. 245 你能回答这些问题吗 (区间查询 + 单点修改)

AcWing. 245你能回答这些问题吗(最大连续区间子段和) 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymax_{x \leq l \leq r \leq y}maxx≤l≤r≤y​∑i=lrA[i]{\sum^{r}_{i = l}A[i]}∑i=lr​A[i]。 2、“2 x y”,把 A[x] 改成 y。 对于每个查询指令,输出一个整数表示答案。 输入格式 第一行两个整数N,M。 第二行N个

zzqwtc的博客 2638

从硬件拆解到图像生成:一次搞懂MRI设备(主磁体、梯度线圈、射频系统)是如何协同工作的

本文深入解析MRI设备的三大核心系统——主磁体、梯度线圈和射频系统如何协同工作,实现从量子现象到诊断图像的转化。通过详细的技术参数和临床案例,揭示磁共振成像(MRI)在医疗图像处理中的精密工程原理和最新技术突破,帮助读者全面理解这一现代医学影像技术的运作机制。

weixin_33734785的博客 549

XMind文件解析黑科技:用Python实现版本自适应读取(兼容2010-2024)

本文深入探讨了如何利用Python实现XMind文件的版本自适应解析,兼容从2010到2024年的各版本。通过分析XMind文件作为ZIP压缩包的本质,文章提供了智能探测文件内部结构(JSON或XML)并构建健壮读取逻辑的完整方案,有效解决了版本兼容性难题,并演示了将解析数据转换为PlantUML等下游应用的实战案例。

weixin_29041767的博客 683

AcWing245. 你能回答这些问题吗(线段树&最大子段和)

线段树维护最大子段和。

陈进士学习的博客 395

基于深度学习的水果新鲜程度检测系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

本文详细介绍了如何使用YOLO系列模型(YOLOv5、YOLOv6、YOLOv7、YOLOv8)构建水果新鲜度检测系统。通过数据集准备、模型训练、推理过程以及UI界面的实现,我们能够构建一个实时检测水果新鲜度的系统。通过本博客,您可以全面了解如何应用深度学习技术解决实际问题,尤其是在智能监控和食品质量检测领域。

YOLO 815

线段树——AcWing 245. 你能回答这些问题吗

线段树是一种用于区间查询和更新问题的数据结构。它通过递归地将一个区间分解为若干子区间,每个节点代表一个子区间的和、最小值、最大值等信息,从而能够在O(log n)时间内完成单点更新和区间查询的操作。线段树的节点数目最多为4n,其中n是原始数组的长度。

u014114223的博客 1801

Pandas滚动窗口的妙用:动态计算列数据的最大值

Pandas的滚动窗口(rolling window)功能是数据分析中处理时间序列数据的重要工具。本文通过实例演示了如何使用rolling(window=4).max()计算DataFrame列A的滚动最大值,并将结果存入新列Max_Range。该方法会在4个元素的滑动窗口内计算最大值,前3行因数据不足显示为NaN。这种技术广泛应用于金融分析(如股价波动)、数据平滑和趋势识别等场景,能有效帮助分析数据的动态变化特征。示例展示了从数据准备到结果输出的完整流程,体现了Pandas在处理滑动窗口计算时的高效性和便

m0_74337424的博客 53

华为数字化转型之道 方法篇 第五章 视IT为投资,用产品思维管理IT

比较传统信息化和数字化转型下的IT系统特征,我们发现业务环境、IT能力、业务和IT的关系都发生了巨大的变化(见图5-1)从“管理系统”到“作业平台”。企业通常的做法是将线下的文档、流程线上化,IT系统是作为管理系统而存在的。而面向数字化,企业的业务作业、业务运营和决策、团队协同等业务动作已经和IT系统集成,IT系统逐步转变为作业系统。从“功能优先”到“体验优先”,如果要整体完成一项工作往往需要用户在不同系统间切换,费时费力。

沧海之巅的专栏 1094

AcWing 245. 你能回答这些问题吗

AcWing 245. 你能回答这些问题吗 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y{∑ri=lA[i]}。 2、“2 x y”,把 A[x] 改成 y。 对于每个查询指令,输出一个整数表示答案。 输入格式 第一行两个整数N,M。 第二行N个整数A[i]。 接下来M行每行3个整数k,x,y,k=1表示查询(此时如果x>y,请交换x,y),k=2表示修改。 输出格式 对于每个查询指令输出一个整

qq_52358098的博客 306

手把手安装GNN必备库 —— pytorch_geometric

PyG全称是Pytorch Geometric,它是一个基于Pytorch构建的库,可以帮助用户快速构建和训练自己的图神经网络模型。PyG中实现了很多先进(state of the art)的GNN模块,例如GCN、GraphSage、GAT、SGC、GIN等等。此外,PyG中还包含了大量的benchmark图数据集、丰富的图数据操作方法、支持多GPU。

m0_51339444的博客 2380

AcWing 245. 你能回答这些问题吗(线段树)

题目链接:https://www.acwing.com/problem/content/246/ 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y {∑ri=lA[i] }。 2、“2 x y”,把 A[x] 改成 y。 对于每个查询指令,输出一个整数表示答案。 输入格式 第一行两个整数N,M。...

年轻过成了秃顶 328

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【ACWing】245. 你能回答这些问题吗(线段树)

原题链接 目录题目:输入输出样例:解题思路:代码:碎碎念: 题目: 输入输出样例: 解题思路: 单点修改和区间查询问题,而且数据是 5e55e^55e5 的,很自然想到了用线段树来维护。 区间最大连续子段和=max(左子树的最大连续子段和,右子树的最大连续子段和)区间最大连续子段和=max(左子树的最大连续子段和,右子树的最大连续子段和)区间最大连续子段和=max(左子树的最大连续子段和,右子树的最大连续子段和)???这样想的话,那么遗漏了一种情况:左端点在左子树,右端点在右子树。所以,最终父节点的答案

Just__Do__IT__的博客 353

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

AcWing 245. 你能回答这些问题吗——线段树

题目链接 题目大意 给你一个长度为N的数列A,以及M条指令(N <= 5e5, M <= 1e5),每条指令可能是以下两种之一: “1 x y”,如果x > y,则交互xy,查询区间[x, y]中最大连续子段和,即maxx ⩽ l ⩽ r ⩽ y{∑i = lrA[i]}max{}_{{}x\ \leqslant \ l\ \leqslant \ r\ \leqslant \ y}\{ \sum^

yezi_coder的博客 227

VC中sqlite的使用

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

AcWing 245. 你能回答这些问题吗(线段树)

线段树好容易段错误啊。。干脆叫线段错误树算了! 如果想复习一下线段树,戳这:线段树蓝书讲解 题意: 思路: 本题依据题意需要进行单点修改,因此无需懒标记pushdown操作,只需要pushup操作即可。 对于查询区间内部的最大子段和,我们需要想想每个节点内部需要存储哪些信息 。 设线段树中的节点为“node”,我们显然最先应该存储区间的左、右端点:l、r,因为线段树本质上是一棵由区间作为节点的二叉树。 同时,依据题意还应该存区间内部的最大连续子段和,我们用total_max表示,简写为tmax。 我们..

Jacob0824的博客 477

AcWing 245:你能回答这些问题吗 ← 线段树

【题目来源】AcWing 245. 你能回答这些问题吗 【算法分析】 针对线段树不同类型问题的算法设计,一种观点认为“首先就是针对问题确定线段树的结点结构属性,之后的任务就直剩套线段树的代码模板了”。个人认为,此观点蛮精辟的。 由于线段树的结点具有多个属性,所以可将query()函数的返回类型定义为线段树的node类型,这样就可以按需查看线段树的任何返回属性值了。【算法代码】 #include<bits/stdc++.h> using namespace std; const int ma

hnjzsyjyj的专栏 212

AcWing 245. 你能回答这些问题吗(线段树)

给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即maxx≤l≤r≤y{∑ri=lA[i]}。 2、“2 x y”,把 A[x] 改成 y。 对于每个查询指令,输出一个整数表示答案。 输入格式 第一行两个整数N,M。 第二行N个整数A[i]。 接下来M行每行3个整数k,x,y,k=1表示查询(此时如果x>y,请交换x,y),k=2表示修改。 输出格式 对于每个查询指令输出一个整数表示答案。 每个答案占.

qq_45098405的博客 204

AcWing - 245 - 你能回答这些问题吗 = 线段树

https://www.acwing.com/problem/content/246/ 一个很有意思的线段树,一般来说要求的最大连续和只需要维护一个从左侧开始/从右侧开始的最大连续和用来跨越区间中点,但是这里居然至少要包含一个元素,所以要进行一些变形。主要是叶子节点里面的各个标记至少要有一个元素。 #include <bits/stdc++.h> using namespac...

aoying6521的博客 124

ACWING245. 你能回答这些问题吗(线段树区间合并)

给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y{∑ri=lA[i]}。 2、“2 x y”,把 A[x] 改成 y。 对于每个查询指令,输出一个整数表示答案。 输入格式 第一行两个整数N,M。 第二行N个整数A[i]。 接下来M行每行3个整数k,x,y,k=1表示查询(此时如果x>y,请...

tomjobs的博客 556

AcWing 245 你能回答这些问题吗(线段树)

难点在于维护这个子段和,线段树每个节点要保存:总和s,包含左端点的lx,包含右端点的rx,最大连续子段和ans。用struct结构保存线段树节点,注意编号p<<1|1,不要写成p<<1+1。单点修改和查询区间最大连续子段和。

ynhnxn的博客 284

【AcWing 245. 你能回答这些问题吗】线段树区间合并

题目链接 题意: 给定长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一: 1 x y,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y{∑i=lrA[i]}。 2 x y,把 A[x] 改成 y。 对于每个查询指令,输出一个整数表示答案。 分析: 对于操作2,是很简单的线段树单点修改,但是对于操作1的话就有点复杂了,比如说要求一个区间内的最大子段和,并不能直接将它的两个子区间的最大子段和加起来,因为他们可能会不连续 ,至于为什么的话请看下面这张图: 看一下这个图把,2

weixin_51979465的博客 209

ACWing 245. 你能回答这些问题吗(线段树区间合并)

题目链接 单点修改,区间查询最大子段和 线段树区间合并模板题 #include<bits/stdc++.h> using namespace std; #define ls (p<<1) #define rs (ls|1) #define mid ((t[p].l+t[p].r)>>1) const int N=500005; int n; stru...

skyline的分享专栏 222

AcWing:245. 你能回答这些问题吗(线段树最大子段和)

给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=lrA[i]}。 2、“2 x y”,把 A[x] 改成 y。 对于每个查询指令,输出一个整数表示答案。 输入格式 第一行两个整数N,M。 第二行N个整数A[i]。 接下来M行每...

weixin_30782331的博客 141

ACwing 245. 你能回答这些问题吗 (线段树 求最大连续字段和 单点修改

添加链接描述 #include<bits/stdc++.h> using namespace std; const int N= 5e5+10; int arr[N]; struct node{ int l,r; int sum,lmax,rmax,tmax; }tr[N*4]; void pushup(node &u,node &l,node &r){ u.sum=l.sum+r.sum; u.lmax=max(l.lmax,l.sum+

我见青山多妩媚,料青山见我应如是 262
下一篇: [线段树] AcWing-246 区间最大公约数
LECOMTEDE
博客等级 码龄4年 1粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值