HDU 3308 LCIS 线段树区间更新

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控 本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。 阅读详情

最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛  ,小媛姐。这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel  这个题目,是一个求连续空区间的情况,而hdoj这个题目是求给定区间单调连续的最大区间长度,两个题目思路很相似,将节点rt用sum[rt],lsum[rt],rsum[rt]来描述,分别表示rt对应区间即[l,r]内满足条件的区间的最大长度,从左边端点l开始满足条件的最大区间长度,从右边r开始向左的满足条件的最大区间长度。

void PushUp(int rt,int m,int mid)//mid表示更新区间的中点,m表示长度
{
    lsum[rt]=lsum[rt<<1];
    rsum[rt]=rsum[rt<<1|1];
    int t=1;
    if(A[mid]<A[mid+1])
    {
        if(lsum[rt]==(m-(m>>1)))
            lsum[rt]+=lsum[rt<<1|1];
        if(rsum[rt]==(m>>1))
            rsum[rt]+=rsum[rt<<1];
        t= rsum[rt<<1]+lsum[rt<<1|1];
    }
       sum[rt]=max(t,max(sum[rt<<1],sum[rt<<1|1]));
}

PushUp函数和query函数是关键  ,PushUp函数向上更新时,先将lsum[rt]用

lsum[rt<<1]也就是左子区间左边开始的最大长度,如果这个区间长度刚好是l到mid之间的长度,说明区间已经穿过中点了,应该在加上右子区间lsum[rt<<1|1]这部分,类似的可以更新rsum[rt]。对于sum[rt]应该对应rsum[rt<<1]+lsum[rt<<1|1],sum[rt<<1],sum[rt<<1|1]三种情况中的最大值,因为满足条件的最长单调区间可以是左半部分,右半部分,或者贯穿中点。

理解了这部分那么query函数可以按照类似的思路来写,但要注意的是对于贯穿中点的判断条件是A[mid]<A[mid+1],这样才能将两部分加起来。

期间又一次犯二TLE了,原本是用C写的,max函数是用的宏定义,结果里面含有query函数,这样最终可能会两次调用query函数,不超时才怪,好在以前犯过一次,被基友发现了,改成algorithm里面的max就过了。哎,有个能debug基友就是好啊。hhha~

#include<cstdio>

#include<cstring>
#include<algorithm>
#define N 100010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;
int sum[N<<2],rsum[N<<2],lsum[N<<2],A[N];

void PushUp(int rt,int m,int mid)
{
    lsum[rt]=lsum[rt<<1];
    rsum[rt]=rsum[rt<<1|1];
    int t=1;
    if(A[mid]<A[mid+1])
    {
        if(lsum[rt]==(m-(m>>1)))
            lsum[rt]+=lsum[rt<<1|1];
        if(rsum[rt]==(m>>1))
            rsum[rt]+=rsum[rt<<1];
        t= rsum[rt<<1]+lsum[rt<<1|1];
    }
       sum[rt]=max(t,max(sum[rt<<1],sum[rt<<1|1]));
}

void build(int l,int r,int rt)
{
    if(l==r)
    {
        sum[rt]=lsum[rt]=rsum[rt]=1;
        return;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    PushUp(rt,r-l+1,m);
}

void update(int p,int l,int r,int rt)
{
    if(l==r)
        return;
    int m=(l+r)>>1;
    if(p<=m)
        update(p,lson);
    else update(p,rson);
    PushUp(rt,r-l+1,m);
}

int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        return sum[rt];
    }
    int m=(l+r)>>1;
    if(l==r)
        return 1;
    int ans=0;
    if(R<=m)
        ans=max(ans,query(L,R,lson));
    else  if(L>m)
        ans=max(ans,query(L,R,rson));
    else
    {
        ans=max(ans,query(L,R,lson));
        ans=max(ans,query(L,R,rson));
        int ll,rr;
        if(m-L+1>=rsum[rt<<1])
            ll=rsum[rt<<1];
        else ll=m-L+1;
        if(R-m>=lsum[rt<<1|1])
            rr=lsum[rt<<1|1];
        else rr=R-m;
        ans=max(ans,ll);
        ans=max(ans,rr);
        if(A[m+1]>A[m])
            ans=max(ans,ll+rr);
    }
    return ans;
}

int main(void)
{
    int T;
    int n,m,a,b;
    char op[3];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            scanf("%d",A+i);
        build(1,n,1);
        while(m--)
        {
            scanf("%s%d%d",op,&a,&b);
            if(op[0]=='U')
            {
                A[a+1]=b;
                update(a+1,1,n,1);
            }
            else
            {
                int ans=query(a+1,b+1,1,n,1);
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

高斯泼溅(Gaussian Splatting):3D建模的颠覆性革命 阅读详情

相关推荐

保姆级教程:从Navicat 11/12到15,平滑升级搞定MySQL 8.0的caching_sha2_password认证

本文提供从Navicat 11/12升级到15的保姆级教程,重点解决MySQL 8.0的caching_sha2_password认证问题。详细介绍了备份配置、新版本功能亮点、跨平台安装步骤、配置迁移流程以及高级使用技巧,帮助用户平滑过渡到Navicat 15,提升数据库管理效率。

weixin_33724046的博客 203

HDU 3308 LCIS 线段树 区间更新

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308   题目描述: 有两种操作, U x y , 第xth赋值为y 。Q x y , 查询区间x-y的最长连续上升子序列的长度L   解题思路: 对于线段树不好的我依然好难.....有太多细节需要注意了....但是这是一道很好的题, 一段区间的L可能从三个地方来, 一种是中间, 一种是以...

weixin_34363171的博客 84

3D Slicer中安装MedSAM插件

大家应该都读过这篇论文:《Segment Anything in Medical Images》这个插件便是该论文团队推出的在3D Slicer上使用的插件,可以分割医学图像的任何感兴趣区域。

m0_73719342的博客 2330

HDU 3308 LCIS (线段树·单点更新·区间合并)

题意  给你一个数组  有更新值和查询两种操作  对于每次查询  输出对应区间的最长连续递增子序列的长度 基础的线段树区间合并  线段树维护三个值  对应区间的LCIS长度(lcis)  对应区间以左端点为起点的LCIS长度(lle)  对应区间以右端点为终点的LCIS长度(lri)  然后用val存储数组对应位置的值  当val[mid + 1] > val[mid] 的时候就要进行区间合并操

Deng's site \# 1330

告别玄学:用Multisim或LTspice仿真带你直观理解PFC的三种工作模式(CCM/DCM/CrM)

本文通过Multisim和LTspice仿真工具,详细解析了PFC(功率因数校正)的三种工作模式(CCM、DCM、CrM)的本质差异。从波形捕捉到参数优化,提供了实用的仿真技巧和工程实践策略,帮助工程师直观理解并优化PFC电路设计,提升THD和功率因数。

weixin_30363285的博客 396

EXCEL VBA 导出高清图片方法

EXCEL VBA 导出高清图片方法 将EXCEL表格内容另存为图片的方法有很多种,简单的比如“复制为图片格式并另存”,“打印成XPS”等等,本文着重的是利用VBA实现的方法。 该方法适合用于中大型图文表格输出为图片格式,方便传阅,在office2010及以上版本最为流畅。 具体看代码: Sub printA4() Dim rng As Range '定义截图范围变量 'm = 20...

nfser_burn7的专栏 1万+

LCIS HDU - 3308(线段树 单点更新+区间合并)

LCIS 题目链接:HDU - 3308 题意:标号1~n的数,两种操作:U  a   b:下标为a的数改为b;Q  a   b:查询区间[a, b]中的最长连续递增子序列; 思路:对于区间[l, r] ;lmax表示以l为起点的最长连续递增子序列,rmax表示以r为终点的最长连续递增子序列,Max表示区间[l, r]中的最长连续递增子序列; 对于两个相邻的区间,如果左区间的最后一个数小...

Sirius_han的博客 331

Zephyr内核——内存管理——内存堆

Zephyr提供了一组允许线程动态分配内存。

wayne2018的博客-心情驿站 772

HDU - 3308 LCIS (线段树 单点更新 区间查询)

hdu 3308 http://acm.hdu.edu.cn/showproblem.php?pid=3308题意:要维护最长连续子序列思路:区间查询,需要知道每段的前缀最大lcis,后缀lcis,每次用子节点来更新父节点的值的时候就要比较左右结点的后缀和前缀能否相连,左节点的lcis,右结点的lcis,这中间最长的就是父节点的lcis。这两天深刻让我认识到了我的线段数和别人的线段树的差别。我的线段

shinimashzi 446

CodeBuddy Code CLI 常用工作流:17个实战场景全解析

CodeBuddy Code CLI 17个实战场景解析 本文详细介绍了CodeBuddy Code CLI在17个开发场景中的高效应用,包括: 快速理解新代码库 高效修复Bug 安全重构代码 使用子代理系统处理专业任务 Plan Mode安全分析 自动化测试处理 创建合并请求 文档生成与维护 图片内容分析 文件目录快速引用 每个场景都配有具体命令示例和最佳实践,帮助开发者提升工作效率。

简简单单Onlinezuozuo 1079

手把手教你学PCIE--PCIe架构详解 - 物理层结构

在前一篇文章中,我们对PCIe与其他总线协议进行了对比分析。本文将深入探讨PCIe的物理层结构,这是PCIe协议的核心组成部分之一。物理层负责实际的电气信号传输,理解其工作原理对于设计和调试PCIe系统至关重要。PCIe的物理层是协议栈的最底层,负责将数据从链路层转换为电信号进行传输,并在接收端将电信号还原为数据。差分信号传输:通过一对差分信号线实现高速、低噪声的数据传输。时钟恢复:从数据流中提取时钟信号以同步收发双方。均衡与预加重:补偿信号在传输过程中的损耗,提高链路可靠性。

MHD0815的博客 362

HDU 3308——LCIS【线段树 & 单点更新 & 区间和并 & 维护区间LIS】

题目传送门 Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting from 0) Q A B: output the length of the longest consecutive increasing subsequ...

NIRVANA REBIRTH 503

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

hdu 3308 LCIS (线段树+单点更新+区间合并)

题意:给定n个数,然后对这n个数进行m次操作。一种操作是将第A个数替换成B,另一种操作是询问区间[a,b]是的最长连续递增子序列的长度。   分析:每个节点分别记录包括左端点的LCIS、包括右端点的LCIS和区间上的LCIS。   代码如下: #include #include #include using namespace std; const int maxn = 100

~飞呀,飞~ 698

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

HDU 3308 LCIS (线段树+区间合并+单点更新)

题意:给你N个整数,有两种操作,(1)“U A B”,表示把第A个数变成B,“Q A B”,表示查询区间[A,B]的最长连续上升序列。 题解:线段树+区间合并+单点更新 因为是连续的序列,基本的区间合并,具体操作内容可以看这篇。 有一点变动就是要求上升,我们只要判断左右子树临界点m,若x[m] < x[m + 1],那么就表示两个区间可以合并。 hdoj一直提交失败,过了样例,应该是正确的。 #define _CRT_SECURE_NO_WARNINGS #include<iostream&gt

gongyuandaye的博客 205

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HDU 3308 LCIS 线段树的单点更新,区间合并

原题链接 Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting from 0) Q A B: output the length of the longest consecutive increasing subse

Merry_hj的博客 394

hdu 3308 LCIS(线段树单点更新+区间合并)中等难度的题目

1、http://acm.hdu.edu.cn/showproblem.php?pid=3308 2、题目大意: 给出一个由n个数字组成的序列,有两种操作,U A B是将A位置的数字替换成B,Q A B是查询A-B区间有多少个递增的数字,也就是求A-B区间的最长上升子序列的长度 这道题目有对区间的查询及对单点的更新,很容易想到线段树,只是在具体实现的时候还是有些困难,具体看代码 3、题目:

sdjzping的专栏 829

HDU 3308 LCIS(线段树单点更新区间合并)

LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (i...

weixin_30726161的博客 92

HDU 3308 LCIS 线段树 单点更新+区间合并

感觉区间合并都一个样,没什么好说的。 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iost...

weixin_33816300的博客 74

hdu.3308 LCIS(线段树,区间合并+单点更新)

区间合并做得

纳兰 531

HDU 3308 LCIS(线段树区间合并 单点更新)

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LL long long #define lson l,m,rt<<1 #define rson m+1,r,rt

哇哈哈的专栏 528

【HDU - 3308】 LCIS 【线段树+单点更新+区间合并】

Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting from 0) Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b].

lzs_lazy 372

HDU - 3308 LCIS(单点更新,区间合并,查询)

HDU - 3308 LCIS 题目 给你长度为 n 的序列,两种操作,1、更新某个点的值,2、查询某个区间里最长连续上升子序列长度。操作一共 m 次。(n,m&lt;1e5n, m &lt; 1e5n,m<1e5) 分析 经典的线段树区间合并题目 首先要维护区间的三个值 区间最长连续上升子序列长度 区间以左端点开始的最长连续上升子序列的长度 区间以右端点结束的最长连续上升...

Stormjing的博客 298

HDU 3308 LCIS (线段树·单点更新·区间合并)

题意 给你一个数组 有更新值和查询两种操作 对于每次查询 输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并 线段树维护三个值 相应区间的LCIS长度(lcis) 相应区间以左端点为起点的LCIS长度(lle) 相应区间以右端点为终点的LCIS长度(lri) 然后用val存储数组相应位置的值 当val[mid + 1] > val[mid] 的时候就要...

weixin_30648587的博客 95

线段树 区间合并解决动态LCIS问题 配题(HDU 3308)

动态LCIS问题:动态的最长连续上升子序列。 如果该序列是静态的,那么既可用线段树的区间合并操作来求解LCIS,又可以使用动态规划方式来求解。 如果该序列是动态的,不断地要更新序列的权重并且进行及时的LCIS求解,此时如果依旧使用DP方式,难免过于耗时,因为动态规划方式,是进行预处理,之后缩短查询的时间,但是一旦序列是动态之后,需要不断地预处理,非常耗时。故使用线段树的区间合并操作来解决动态L...

猫ER 1216
下一篇: UVA 11045 My T-shirt suits me
rootial
博客等级 码龄15年 2粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值