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

51单片机-点亮LED和蜂鸣器 ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。ULN2003是大电流驱动陈列,多用于单片机、只能仪表、PLC、数字量输出卡等控制电路中。可直接驱动蜂鸣器、继电器等负载。void delay(u16 i) // i等于1大约10uswhile(i--);//取反,高低电平不断变化,产生脉冲delay(10);// 周期200us。 阅读详情

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;
}
平头哥面试——芯片工程师面经 有5个成递增关系的32bit地址值,彼此之间的间隔大小不确定,可以把他们当成parameter来输入模块,现有一个32bit输入数据,要求用尽量少资源去的判断这个数处于哪2个地址之间(地址区间),并且输出区间号。a)后续大概会在9月下旬谈具体的薪资,他们现在也没想好今年应届生的薪资该给多少,到时候如果可以签三方的话可能会跳过意向书环节直接发offer,谈薪资肯定是通过电话来。b. 这边的CPU是自己研制的(玄铁),成都这边主要做存储和网络,都有SOC。a. 成都这边的网络部门具体做的业务有哪些? 阅读详情

相关推荐

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2785

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

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

2301_76575887的博客 1150

facebook协议

支持同时登录多个Facebook账号,按照关键词采集小组地址,群发小组,批量添加推荐人,群发推 荐人消息,采集个人Facebook用户,群发用户私信,群发主页评论。通过客服台管理功能,和粉丝互动聊天,通过话术快捷回复,自动翻译聊天记录。通过FaceBook小组采集小组成员id,或者通过FaceBook个人主页,采集主页上粉丝批量操作已FaceBook账号添加推荐热,可以指定添加某个国家的推荐人,可以设置每个账号添加推荐人个数去重模式:所有的FaceBook账号不添加重复的推荐人。

2503_90751938的博客 958

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

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

weixin_74749489的博客 375

扩视机器视觉—Halcon机器视觉48个实战项目六(检测定位角度)

此项目halcon检测检测定位角度问题,并显示。

qq_21516871的博客 1093

计算机组成原理实验(已通关)-华中科技大学头歌Educoder(Logisim)

汉字国标码转区位码实验 汉字机内码获取实验 8位可控加减法电路设计 第2关 CLA182四位先行进位电路设计 第3关 4位快速加法器设计 第4关 16位快速加法器设计 第5关 32位快速加法器设计 第6关 5位无符号阵列乘法器设计 6位有符号补码阵列乘法器 乘法流水线设计 原码一位乘法器设计 偶校验编码设计 偶校验解码电路设计 16位海明编码电路设计 16位海明解码电路设计 海明编码流水传输实验 16位CRC并行编解码电路设计 CRC编码流水传输实验

紫荆鱼的博客 4万+

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

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

mumei的博客 345

Dify部署后访问报502?手把手教你排查和修复Nginx反向代理问题

本文针对Dify部署后常见的502 Bad Gateway错误,提供了从基础容器状态检查到Nginx配置与Docker网络诊断的完整排查流程。详细解析了错误本质,并给出动态服务发现修复与静态IP配置两种解决方案,帮助开发者彻底解决Nginx反向代理问题,确保Dify平台稳定访问。

rnn9storyteller的博客 1096

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

示例: 输入: [-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万+

fNIRS 公开数据集整理

关注“心仪脑”查看更多脑科学知识的分享。 关键词:数据整理、fNIRS 之前我们向大家推送了 Public Neuroscience Dataset 系列主题的第一期:《EEG公开数据集》,我们同时意识到大家对于神经科学公开数据集的需求。本期是该系列主题的第二期,我们在延续第一期初衷的基础上,整理了功能性近红外光谱(fNIRS)技术的公开数据集。 fNIRS 是一种非侵入性、便携且价格低廉的光学神经成像技术,它具有可观的空间和时间分辨率。因fNIRS技术问世较EEG晚了许多,所以应用此技术开展研究发.

psybrain的博客 4271

SAP 物料主数据 Forecasting 视图,别把预测只当成一个数字字段

摘要(150字): SAP S/4HANA物料主数据的Forecasting视图常被忽视,但对依赖历史消耗规律的物料至关重要。该功能基于工厂维度的历史消耗数据,结合预测参数自动计算未来需求,动态调整重订货点和安全库存。预测模板(Forecast Profile)能标准化参数设置,而消耗数据(Consumption Values)的质量直接影响预测结果。预测值作为MRP输入,需注意保存操作才能生效。自动重订货点功能通过分析消耗波动和服务水平,实现库存策略的动态优化。Individual Forecast功能则

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

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

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

1900的博客 8144

HBase在物流行业的应用:轨迹数据存储

想象一下,每天在全球范围内,数以亿计的物流包裹在各个城市、乡镇间穿梭。每一个包裹从发货人手中出发,经过仓储中心、转运站,最终到达收货人手中,这一路上都留下了它的“足迹”,也就是我们所说的轨迹数据。这些数据就像一个个拼图碎片,完整拼接起来后,能够清晰地呈现出整个物流网络的运行状况。例如,你在网上购买了一件心仪已久的商品,迫不及待地想知道它现在到哪儿了。物流平台实时更新的轨迹信息,让你可以准确了解包裹是在运输途中,还是已经到达附近的站点。

架构师的AI之路,分享AI应用开发架构的学习与实践。 965

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

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

qq_38136552的博客 532

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

CDOJ_844 程序设计竞赛

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

weixin_30622181的博客 99

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值