(CDOJ 844 线段树区间最大连续和 )<线段树的各种姿势>

车载通信技术原理-CAN通讯和代码配置:奥迪A6轿车总线拓扑图 CAN总线是一种用于汽车监测与控制系统的串行通信协议,由德国Bosch公司开发。它具有多主工作方式、优先级仲裁、高抗干扰等特点,支持点对点、广播等多种通信方式,传输距离可达10公里。CAN协议采用差分信号传输,物理层使用双绞线,数据链路层实现错误检测、位填充等功能。协议帧类型包括数据帧、遥控帧、错误帧等。CAN总线自1986年发布以来,已成为汽车电子系统的标准配置,广泛应用于车载网络。文章还提供了S32K144芯片的CAN驱动代码示例。 阅读详情

Problem

给定一个序列,每个点有相应权值
有两种操作:
①修改某个点的权值
②查询给定区间的最大连续区间和


Solution

  • 首先要理解清楚题意,是在给定区间内求最大连续子序列。所以暴力的方法很简单,每次在给定区间上贪心地求即可。复杂度O(m∗n)
  • 优化一点可以用线段树
  • 线段树上维护4个值:区间总和s,从左端起的最大连续区间和ls,从右端起的最大连续区间和rs,整个区间最终的最大连续区间和ms。
  • pushup操作

ⅰ ls的修改

可以更新为左子树的ls,或者左子树的s+右子树的ls,分别对应第一条红线和第二条红线

ⅱ rs的修改
同ls的更新一样,可以更新为右子树的rs,或者右子树的s+左子树的ls
目的是保证从端点开始

ⅲ ms的修改
正常的情况是更新为左右子树的max(ms),但是有一种特殊情况:
左子树的rs和右子树的ls是连续的,因此有可能左子树的rs+右子树的ls的值更大
所以一共三种情况

ⅳ s的修改
很简单,把左右子树的s加起来即可
一般来说求最值不需要记录区间和,但这个问题涉及到区间的交并,s可以用于解决完全包含某个子区间的问题(如ls,rs的修改时)

  • query是这个题最难的部分
    ⅰ 同样要维护4个全局变量:区间最大连续子序列anss(即最终答案),从左端点开始的最大连续子序列ansl,从右端点开始的最大连续子序列ansr,已经更新过的区间和sum(同样需要区间和来帮助询问答案)
    ⅱ 线段树一个很重要的性质是:每次更新或者询问一定是先处理左子树,后处理右子树,因此sum维护的是从询问区间最左端到当前区间的区间和,利用sum可以很巧妙的维护其它3个的值
    ⅲ 具体实现的方法
    if(ll<=L&&rr>=R){
        ansl=max(ansl,sum+t[pos].ls);//不更新,或者更新为:左面所有的值的和sum+当前区间的ls,利用线段树更新的顺序是先左后右,可以确保ansl维护的值是从最左端开始的
        anss=max(ansl,anss);
        anss=max(anss,t[pos].ms);
        anss=max(anss,ansr+t[pos].ls);
        ansr=max(ansr+t[pos].s,t[pos].rs);//同样利用sum的性质更新
        anss=max(ansr,anss);
        sum+=t[pos].s;
        return;
    }

ⅳ 最后需要注意的是,ansr的更新必须放在anss之后,因为如果先更新ansr,那么ansr的值有可能会包含当前区间的值,这样会造成重复

Code

// by spli
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;

const int N=500010;
const LL inf=100000000ll;
int n,m;
struct seg{
    int L,R;
    LL s,ms,ls,rs;
}t[N*4+5];
LL ansl=-inf,ansr=-inf,anss=-inf,sum=0;

void pushup(int pos){
    t[pos].s=t[pos<<1].s+t[pos<<1|1].s;
    t[pos].ms=max(t[pos<<1].ms,max(t[pos<<1|1].ms,t[pos<<1].rs+t[pos<<1|1].ls));
    t[pos].ls=max(t[pos<<1].ls,t[pos<<1].s+t[pos<<1|1].ls);
    t[pos].rs=max(t[pos<<1|1].rs,t[pos<<1|1].s+t[pos<<1].rs);
}

void build(int pos,int L,int R){
    t[pos].L=L;
    t[pos].R=R;
    if(L==R){
        scanf("%lld",&t[pos].s);
        t[pos].ms=t[pos].ls=t[pos].rs=t[pos].s;
        return;
    }
    int mid=(L+R)>>1;
    build(pos<<1,L,mid);
    build(pos<<1|1,mid+1,R);
    pushup(pos);
}

void update(int pos,int k,int v){
    int L=t[pos].L;
    int R=t[pos].R;
    if(L==R){
        t[pos]=(seg){L,R,v,v,v,v};
        return;
    }
    int mid=(L+R)>>1;
    if(k<=mid) update(pos<<1,k,v);
    else update(pos<<1|1,k,v);
    pushup(pos);
}

void query(int pos,int ll,int rr){
    int L=t[pos].L;
    int R=t[pos].R;
    if(ll>R||L>rr) return;
    if(ll<=L&&rr>=R){
        ansl=max(ansl,sum+t[pos].ls);
        anss=max(ansl,anss);
        anss=max(anss,t[pos].ms);
        anss=max(anss,ansr+t[pos].ls);
        ansr=max(ansr+t[pos].s,t[pos].rs);
        anss=max(ansr,anss);
        sum+=t[pos].s;
        return;
    }
    int mid=(L+R)>>1;
    query(pos<<1,ll,rr);
    query(pos<<1|1,ll,rr);
}

int main(){
    scanf("%d%d",&n,&m);
    build(1,1,n);
    int k,x,y;
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&k,&x,&y);
        if(k==1){
            anss=ansl=ansr=-inf;sum=0;
            query(1,x,y);
            printf("%lld\n",anss);
        }
        if(k==2) update(1,x,y);
    }
    return 0;
}
【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键) 1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。 阅读详情

相关推荐

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1401

P4513 小白逛公园(线段树 + 连续区间和最值)

洛谷 P4513 小白逛公园(线段树 + 连续区间和最值)

2301_76575887的博客 1150

单细胞空间转录组分析流程学习python版(三)

空转python版学习

zfyyzhys的博客 2085

动态求连续区间和(线段树 树状数组)

如果不是叶子节点,那么先求中点,建左子树(l到mid),建右子树(mid+1到r)1️⃣如果所求区间左节点小于或等于mid,去查询这个左区间的值 ,并加到sum中。2️⃣如果所求区间右节点大于mid,去查询这个右区间的值,并加到sum中。如果是叶子节点,赋值结构体的左区间,右区间,值。向上更新,建树,求区间和,修改节点值。如果目标节点 mid 向右寻找。如果这个区间被覆盖,直接返回值。如果找到节点 直接加上目标值。如果没有被覆盖,求中间节点。最后向上更新pushup。

weixin_74749489的博客 375

本地如何安装midscene.js运行环境

手把手教你本地安装midscene.js运行环境

实践助梦想成长 2608

Neo4j桌面版导入CVS文件

我们的relation.csv是这样的。

m0_53573725的博客 817

HDU1540——线段树维护连续区间

题目链接:https://vjudge.net/problem/HDU-1540#author=cqbzguomao Description 在抗日战争期间,华北平原广大地区进行了大规模的隧道战。 一般来说,通过隧道连接的村庄排成一列。 除了两端,每个村庄都与两个相邻的村庄直接相连。 入侵者经常对一些村庄发动袭击并摧毁其中的部分隧道。 八路军指挥官要求最新的隧道和村庄连接状态。 如果某些...

mumei的博客 345

Windows 10/11系统下TurboDesign 6.4.0完整安装指南(附序列号+破解补丁)

本文提供Windows 10/11系统下TurboDesign 6.4.0的完整安装指南,涵盖系统环境预检、安装程序部署、序列号处理及破解补丁部署等关键步骤。通过详细的安装教程和优化配置,帮助用户高效完成这款涡轮机械设计软件的安装与调试,解决常见兼容性问题。

s4t5u6v的博客 1030

三种解法求:最大连续子序列的和

示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 一、贪心思想 假设a[l]...a[r]的和为 sum 如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留 如果 sum <0,则说明 sum 对结果无增益效果,需要舍弃 明白了这个道理,那么对于第i个数来说,我们查看他之前的sum,如果sum<0,那么当前的最大连续子序列和就是它本身(舍弃前面的);如果sum&gt...

马小超 1万+

PostgreSQL+PostGIS空间数据入库实战:从矢量栅格到GeoServer发布全流程

本文详细介绍了将矢量与栅格空间数据导入PostgreSQL并利用PostGIS扩展进行管理的完整流程。内容涵盖环境搭建、使用shp2pgsql和raster2pgsql工具进行数据入库、基础空间查询验证,以及最终通过GeoServer发布为地图服务的实战步骤,为构建空间数据平台提供清晰指引。

weixin_29268267的博客 289

1、 快速掌握R:初学者的计量经济学指南

本博文旨在为初学者提供一个快速掌握R语言的指南,特别是针对计量经济学领域的应用。内容涵盖了R的基本操作、数据管理、可视化、函数编写以及高级统计分析方法,如OLS回归、异方差修正和集群标准误差计算等。通过实际示例和详细说明,帮助读者在数据分析和科学研究中更加得心应手。

weixin_35734408的博客 148

最大连续区间和算法详解+代码

写在前边 本篇主要记录了最大连续区间和的暴力算法和dp算法(三种写法) 以及讲解了求最大区间和的区间左右下标的方法 ----------------------------------------------------------------------------------- 问题概述 这是一个经典的问题。 给定一个长度为n的序列a[1],a[2]...a[n-1],a[n] ...

1900的博客 8144

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 441

CDOJ 844 线段树区间最大连续和

程序设计竞赛 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) “你动规无力,图论不稳,数据结构松散,贪心迟钝,没一样像样的,就你还想和我同台竞技,做你的美梦!今天这场比赛,就是要让你知道你是多么的无能!!” 不训练,无以为战。有nn项能力是ACM竞赛

qq_38136552的博客 532

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

cdoj844-程序设计竞赛 (线段树的区间最大连续和)【线段树】

http://acm.uestc.edu.cn/#/problem/show/844 程序设计竞赛 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) SubmitStatus “你动规无力,图论不稳,数据结构松散,贪心迟钝,没一样像样的,就你...

weixin_30767921的博客 104

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CDOJ_844 程序设计竞赛

原题地址:http://acm.uestc.edu.cn/#/problem/show/844 “你动规无力,图论不稳,数据结构松散,贪心迟钝,没一样像样的,就你还想和我同台竞技,做你的美梦!今天这场比赛,就是要让你知道你是多么 的无能!!” 不训练,无以为战。有n项能力是ACM竞赛要求的,训练则能提升,忽略则会荒废。 这m天,你能做到如何。 Input 第...

weixin_30622181的博客 99

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

UESTC 844 程序设计竞赛 【维护值稍多的线段树】

【题目大意】 维护一个序列,使之支持一下两种操作: 1、单点修改 2、查询一个区间子区间最大值(在某个区间中任意寻找一段连续子区间,使得该子区间的和最大)(以下将该值称为‘答案’) 【解题思路】 线段树做法: 考虑维护四种和:sum,suml,sumr,subsum,分别是区间和,左端点开始连续最大和(以下将该值称为‘左始和’),右端点结束连续最大和(以下将该值称为‘右结和’),答案

Lannister_Stark的博客 623

待写

线段树 区间合并 CDOJ844  POJ3667 HDU3308 HDU1540

ACUNSTOPPABLE 226

CDOJ 838 母仪天下 树状数组 (2014数据结构专题

母仪天下 Time Limit: 1 Sec  Memory Limit: 162 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/838 Description 富庶的建业城中,有一条格格不入的长街,名曰跳蚤街,被战争所致的孤儿,聚集于此。全国的经济都在为战争服务之时,也无人顾得了这里了。 除了两位夫人。 ...

weixin_34307464的博客 192

最大连续区间和的算法总结

最大连续区间和是一个经典的问题。给定一个长度为n的序列a[1],a[2]...a[n-1],a[n],求一个连续的子序列a[i],a[i+1]...a[j-1],a[j],使得a[i]+a[i+1]...a[j-1]+a[j]最大。①最简单最容易想到的就是根据定义来枚举。枚举上下界{i,j | 0<=i<=j<=n},维护一个max值即可。其中枚举上下界的时间复杂度为O...

weixin_30732825的博客 377

最大连续区间和问题

问题:在数字串中,每次在不重复的数上加0 ~ n个x,每次加x都是独立的,并且求每次最大的子串和。 #include<bits/stdc++.h> #define ll long long using namespace std; const int N = 5005; int f[N][N];//f[i][j]表示以i结尾的、给j个元素添加x后的最大连续数组和 void solve(){ int n,x; cin>>n>>x; for(i

glide的博客 461

线段树之区间最大连续和问题

问题:对于一颗线段树,每次询问[L,R],求此区间中任意一段连续序列,此连续序列和最大。 解法:每个节点维护4个值: max:此区间内的最大连续和 sum:该节点以下的节点值得总和 lmax:此区间的从左端开始的最大连续和 rmax:此区间的从右端开始的最大连续和 合并区间时,该区间的最大连续和为:max(左子节点的最大连续和,右子节点的最大连续和,左子节点的最大右连续...

weixin_30278311的博客 301

hdu3911(线段树区间异或+区间和并+查询最区间大连续1的个数)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意:给定序列(只有0,1),修改是将0变成1,1变成0,询问是查询区间最大连续1的数目。 用线段树维护7个变量: 第1,2个是区间的最大前缀0,和前缀1 第3,4个是区间的最大后缀0,和后缀1 第5,6个是区间的最大连续0,和最大连续1 第7个是lazy(区间更新必备) 由于我们存了...

weixin_30646315的博客 431

E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)

E. Sign on Fence 给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai​≤109,有mmm次询问,每次给定l,r,kl, r, kl,r,k,要我们在[l,r][l, r][l,r]区间内找到一个长度为kkk的区间,使得区间最小值最大,输出最大值。 考虑二分答案,如果当前二分的区间是[l,r][l, r][l,r],我们把大于midmidmid的点,在数组中都设置为111,小于等于midmidmid的点,在数组中都设置为000, 考虑用线段树

lifehappy 669

线段树(以区间和为例)

​ 线段树的根节点是一个长区间,例如输入不超过N个的数,那么可以将根节点设为[1,N],它的左右子节点为均分父节点的两个区间,即左半区间和右半区间1⌊N12⌋⌊N12⌋1N1⌊2N1​⌋][⌊2N1​⌋1N,依次递归地建立,直到叶子节点,即区间ii[i,i]ii。

shiki217_的博客 1694
上一篇: (CF 148D Bag of mice)<简单概率DP>
下一篇: (poj 3667 Hotel)<丧病线段树区间合并>
SDFZspli
博客等级 码龄10年 17粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值