首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

P7706 文文的摄影布置 题解

编程知识
2024年08月21日 18:01

P7706 文文的摄影布置 题解

原题

读完题,发现是线段树。单点修改+区间查询。

不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个 ψ 值(下称待求值)。

对于一个区间的待求值,大概有四种情况:

如上图四种情况分别为:

  1. 待求值最大值在左区间
  2. 待求值最大值在右区间
  3. \(a_i与b_j\) 在左区间
  4. \(b_j与a_k\) 在右区间

考虑合并的方式:

对于1,2,返回左右区间的较大的待求值。

对于3,4,维护左右区间的 \(lt\)\(rt\) ,分别代表,较大的 \(a_i-b_j\) 及 较大的 \(a_k-_j\) ,更新时加上另一侧较大值即可。

由此,得出线段树结构体需要维护的值有:\(maxx,minn,lt,rt,mx\) ,分别为最大的 \(a\) ,最小的 \(b\) ,较大的 \(a_i-b_j\) 及 较大的 \(a_k-_j\) ,和本区间的最大待求值。

于是可得代码:

#include <bits/stdc++.h>
#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ll long long
using namespace std;
const int maxn = 5e5+10;
const ll inf=-1e8-10;
struct pect{
    ll s,b;                                          //存图片
}a[maxn];
struct node{
    ll maxx,minn;                                    //maxx为区间a最大,minn为区间b最小
    ll lt,rt,mx;                                     //lt为区间 min(bj)-ai,rt为区间 ak-min(bj)
}tree[maxn<<2];

ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}

node up_date(node a,node b){
    node p;
    p.maxx=max(a.maxx,b.maxx);
    p.minn=min(a.minn,b.minn);
    p.lt=a.maxx-b.minn;
    p.rt=b.maxx-a.minn;
    p.lt=max(p.lt,max(a.lt,b.lt));                //三种情况取最大
    p.rt=max(p.rt,max(a.rt,b.rt));
    p.mx=max(a.lt+b.maxx,b.rt+a.maxx);            //情况取最大
    p.mx=max(p.mx,max(a.mx,b.mx));
    return p;
}

void push_up(ll p){
    tree[p]=up_date(tree[ls(p)],tree[rs(p)]);
}

void build(ll p,ll pl,ll pr){
    if(pl==pr){
        tree[p].maxx=a[pl].s;
        tree[p].minn=a[pl].b;
        tree[p].lt=tree[p].rt=tree[p].mx=inf;
        return;
    }
    ll mid=(pl+pr)>>1;
    build(ls(p),pl,mid);
    build(rs(p),mid+1,pr);
    push_up(p);
}

void change(ll x,ll d,ll p,ll pl,ll pr,ll op){
    if(pl==pr){
        if(op==1) tree[p].maxx=d;
        if(op==2) tree[p].minn=d;
        return;
    }
    ll mid=(pl+pr)>>1;
    if(x<=mid) change(x,d,ls(p),pl,mid,op);
    else change(x,d,rs(p),mid+1,pr,op);
    push_up(p);
}

node query(ll l,ll r, ll p,ll pl,ll pr){
    if(l<=pl&&r>=pr)
        return tree[p];
    ll mid=(pl+pr)>>1;
    if(l>mid) return query(l,r,rs(p),mid+1,pr);
    if(r<=mid) return query(l,r,ls(p),pl,mid);
    return up_date(query(l,r,ls(p),pl,mid),query(l,r,rs(p),mid+1,pr));
}

ll n,m,op;

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    seq(i,1,n){
        cin>>a[i].s;
    }
    seq(i,1,n){
        cin>>a[i].b;
    }
    build(1,1,n);
    while(m--){
        int x,y;
        cin>>op>>x>>y;
        if(op==1){
            change(x,y,1,1,n,1);
        }
        if(op==2){
            change(x,y,1,1,n,2);
        }
        if(op==3){
            cout<<query(x,y,1,1,n).mx<<endl;
        }    
    }
    return 0;
}
From:https://www.cnblogs.com/adsd45666/p/18372350
本文地址: http://www.shuzixingkong.net/article/1308
0评论
提交 加载更多评论
其他文章 目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频)
ByteTrack是字节跳动与2021年10月份公开的一个全新的多目标跟踪算法,原论文是《ByteTrack: Multi-Object Tracking by Associating Every Detection Box》。 ByteTrak的MOTA和FPS等指标上都实现了较好的性能,要优于现
目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频) 目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频) 目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频)
使用Packer构建镜像
什么是Packer Packer 是一个强大的工具,它可以帮助我们轻松地构建各种类型的镜像,如虚拟机镜像、Docker 镜像等。 Packer 的工作原理是通过定义一个配置文件,该文件描述了要构建的镜像的特征和要求。然后 Packer 使用这个配置文件来执行一系列的步骤,例如安装必要的软件、配置系统
使用Packer构建镜像 使用Packer构建镜像 使用Packer构建镜像
使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
前言 当前.NET环境下,生成WebApi代理类的工具已经有很多选择了,比如OpenApi Generator,NSwag和Refitter等,不同的工具生成的代码风格以及实现方式略有不同,比如Refitter生成的客户端是Refit风格. 本人比较喜欢Refit风格的标注风格因此还是比较喜欢使用R
使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
poi的excel导出
poi的excel导出 这个导出依赖于模板文件,可便捷设置表头样式。 也可以不使用模板,直接创建。 1.引入poi依赖 &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &lt;artifactId&gt;poi&lt;
poi的excel导出 poi的excel导出
WPF:MVVM的由来与属性绑定的过程
WPF:MVVM的由来与属性绑定的过程 1、MVVM (1)MVVM是什么? ​ MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式。有助于分离应用程序的业务逻辑和用户界面层,使得开发过程更易于管理,同时也便于单元测试。 Model? 现实世界中对象的抽象结果。
WPF:MVVM的由来与属性绑定的过程 WPF:MVVM的由来与属性绑定的过程 WPF:MVVM的由来与属性绑定的过程
代码随想录Day22
77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2: 输入:n = 1
代码随想录Day22
CVSS(Common Vulnerability Scoring System)打分规则解读
CVSS(Common Vulnerability Scoring System)提供了一种根据漏洞的主要特征进行打分,反映其严重性的方法。CVSS 已成为被广泛使用的标准。 下面是CVSS 3.1版本计算器的界面截图,本文对Base Score的打分标准做解读,并提供一些建议。同时会对每个维度选项
CVSS(Common Vulnerability Scoring System)打分规则解读
Python被远程主机强制关闭后怎么自动重新运行进程
要实现Python程序在被远程主机强制关闭后能够自动重新运行,我们可以采用几种方法,但最直接且常用的方法之一是结合操作系统级的工具或脚本。在Linux系统中,我们可以使用cron作业或者systemd服务来实现这一功能;在Windows系统中,可以使用任务计划程序。但在这里,为了提供一个跨平台的、更