首页 > 其他分享 >245.你能回答这些问题吗

245.你能回答这些问题吗

时间:2024-02-29 17:00:11浏览次数:17  
标签:问题 需要 线段 回答 特判 245 区间 query include

这道题线段树要维护的信息较多,我们在设计线段树存储的信息时,如果发现父节点的信息不能由字节的信息更新而来,而是需要从原数组中获取信息,那么就需要多设计线段树的成员变量,只掉其内部能够自洽,形成闭环为止。

这道题pushup函数的设计非常巧妙,可以重点记忆学习。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#define For(i, j, n) for(int i = j ; i <= n ; ++i)
using namespace std;

const int N = 500001, M = 100001;

int n, m, a[N];

struct node{
    int l, r;
    int ans, maxf, maxb, sum;
} tr[N << 2];

void pushup(node &u, node l, node r)
{
    u.sum = l.sum + r.sum;
    u.ans = max(max(l.ans, r.ans), l.maxb + r.maxf);
    u.maxf = max(l.maxf, l.sum + r.maxf);
    u.maxb = max(r.maxb, r.sum + l.maxb);
}

void pushup(int u)
{
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void build(int u, int l, int r)
{
    tr[u] = {l, r};
    if(l == r)
    {
        tr[u].sum = a[l];
        tr[u].maxf = a[l];
        tr[u].maxb = a[l];
        tr[u].ans = a[l];
        return;
    }
    int mid = l + r >> 1;
    build(u << 1, l, mid);
    build(u << 1 | 1, mid + 1, r);
    pushup(u);
}

node query(int u, int l, int r)
{
    if(tr[u].l >= l && tr[u].r <= r)
        return tr[u];
    int mid = tr[u].l + tr[u].r >> 1;
    if(r <= mid)
        return query(u << 1, l, r);
    if(l > mid)
        return query(u << 1 | 1, l, r);
    node res;
    pushup(res, query(u << 1, l, r), query(u << 1 | 1, l, r));
    return res;
}

void modify(int u, int k, int x)
{
    if(tr[u].l == tr[u].r)
    {
        tr[u].sum = x;
        tr[u].maxf = x;
        tr[u].maxb = x;
        tr[u].ans = x;
        return;
    }
    int mid = (tr[u].l + tr[u].r) >> 1;
    if(k <= mid)
        modify(u << 1, k, x);
    else
        modify(u << 1 | 1, k, x);
    pushup(u);
}

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    build(1, 1, n);
    int op, x, y;
    while(m--)
    {
        scanf("%d", &op);
        if(op == 1)
        {
            scanf("%d%d", &x, &y);
            if(x > y)   swap(x, y);
            printf("%d\n", query(1, x, y).ans);
        }
        else
        {
            scanf("%d%d", &x, &y);
            modify(1, x, y);
        }
    }
    return 0;
}

在modify或者query这种向下递归的函数当中,有时候目标区间全部在当前区间的半边需要特判、额外处理;有时候目标区间横跨当前区间两边又成了特例,需要特判。

如何判断哪个情况需要特判?

谁复杂,谁就需要特判。

标签:问题,需要,线段,回答,特判,245,区间,query,include
From: https://www.cnblogs.com/smartljy/p/18044771

相关文章

  • 解决nginx配置返回403实际返回404的问题
    背景某油项目安全漏扫,要求特定的一些资源不允许外部访问,只能在VPC内部相互访问。准备对需要屏蔽的资源,配置nginx反向代理,直接return403,配置完成后实测发现nginx返回了404。解决方案经过分析,基本确定是因为nginx的403错误页面没有配置导致的,把403的错误页面配置加上即可,具体配......
  • webserver服务器常见问题
    目录Reactor和Proactor的区别Reactor和Proactor的区别Reactor和Proactor都是处理并发编程中的I/O多路复用问题的设计模式。它们的主要区别在于处理I/O事件的方式。Reactor模式:Reactor模式是一种同步I/O模式,它等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给......
  • 经典同步问题及其伪代码实现
    1、生产者消费者问题信号量版本://定义缓冲区大小bufferSize=10//定义互斥锁和信号量mutex=Semaphore(1)full=Semaphore(0)empty=Semaphore(bufferSize)//定义生产者函数defproducer():whiletrue://生成数据data=generateData()......
  • 使用Navicat for MySQL远程访问MySql8.0的问题。
    首先我们进入mysql,查看mysql中所有用户权限usemysql;selectuser,hostfromuser;我们发现host默认都是localhost访问权限我们要修改root的远程访问权限updateusersethost='%'whereuser='root';再次执行selectuser,hostfromuser;说明我们已经修改成功了。允许......
  • signature hdr data: BAD, no. of btyes(9088) out of range 问题排查与解决方案
    在使用yum工具安装gcc的时候,报出了signaturehdrdata:BAD,no.ofbtyes(9088)outofrange的问题这是由于centos8中rpm工具存在的一个bug,在校验安装包头部大小的时候,应当限制为64M,但是实际限制了64k这个问题存在于rpm-4.14.3-4.el8.x86_64等版本查看你本机的rpm版本可......
  • VisionPro相机掉线问题
    最近有一个项目用到visionpro,遇到一个问题记录一下。就是相机频繁掉线。报错信息:在网上查找原因,关闭防火墙、设置巨帧模式、调大接收缓存区都试过,没有改善。因为其他原因,我们中途换了海康相机。但是两款相机都有掉线的问题。所以排除相机的因素。 并且这个项目我们有两台......
  • 实战上,通过一段ID 生成器代码,学习如何发现,代码质量的问题(设计模式)
    ID生成器的需求背景介绍ID中文翻译为标识Identifier,这个概念在生活,工作中随处可见,比如身份证、商业条形码、二维码、车牌号、驾照号。聚焦到软件开发中,ID常用来标识一些业务信息的唯一标识,比如订单的单号或者数据库中的唯一主键,比如地址中ID字段(实际上时没有业务含义的,对用......
  • 【BUG】axios 长数字精度丢失问题
    问题原因出现改问题是于javascript整数范围问题java中Long类型-2的63次方-2的63次方减去1但是javascript整数范围确没有那么大,导致Long数字过大前端精度丢失使用json-bigint解决安装npmijson-bigint#或yarnaddjson-bigintimportJSONbigfrom'json-......
  • .net 应用程序 生成Docker映像时 dotnet restore找不到自定义源的包的问题,ContainerBu
    一、问题:我们在.net应用中生成Docker映像时,会出现ContainerBuildAndLaunch任务意外失败的问题。 查看输出窗口发现,是执行dotnetrestore时,找不到包的问题,因为我的这些包是在自己的私有源上二、解决方案:在Dockerfile文件中,在执行dotnetrestore前一行添加nuget私有源就行......
  • 【APP逆向18】解决NO_PROXY抓包问题
    1.前置:在抓包某货app时,基于关键字搜索,我们发现抓不到返回商品信息的接口,这是怎么回事呢?这是因为在安卓开发时,OkHttp发送请求,设置Proxy.NO_PROXY,基于系统代理都是抓不到包。OkHttpClientclient=newOkHttpClient();FormBodyform=newFormBody.Builder().add("user"......