P7706 文文的摄影布置 题解

news/2024/11/15 22:32:07/文章来源:https://www.cnblogs.com/adsd45666/p/18372350

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784993.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息学奥赛初赛天天练-71-NOIP2016普及组-基础题2-进制转换、二进制转八进制、八进制转二进制、二叉树数组存储、寻址空间

NOIP 2016 普及组 基础题2 4 以下不是 CPU 生产厂商的是( ) A Intel B AMD C Microsoft D IBM 8 与二进制小数 0.1相等的八进制数是( ) A 0.8 B 0.4 C 0.2 D 0.1 9 以下是 32 位机器和 64 位机器的区别是( ) A 显示器不同 B 硬盘大小不同 C 寻…

CF 2001 E2 solution (967 Div.2)

CF 2001 E2 由于对称,所以设 \(heap[u]\) 为两次确定堆,且第一次弹出的是 \(u\),\(heap[u,v]\) 是第一次 \(u\) ,第二次 \(v\) 则答案就是 \(\sum heap[u]=2^{n-1}heap[x]\) 其中 \(x\) 任意。 不妨我们考虑第一次都是从第一个叶子弹出,那么对于其他不同的第二个弹出的点…

pytest和unittest的几个区别

主要区别1、安装需求:  pytest:作为第三方单元测试库,需要额外安装。  unittest:是Python标准库的一部分,无需额外安装。2、用例编写规则:  pytest:编写规则较为简单,兼容性好,可以执行unittest风格的测试用例,无需修改unittest用例的任何代码。  unittest:…

【Linux】分区向左扩容的方法

@目录为什么是向左扩容操作前的备份方法:启动盘试用Ubuntu后进行操作为什么是向左扩容 Linux向右扩容非常简单,无论是系统自带的disks工具还是apt安装的gparted工具,都有图像化的界面可以操作。但是,都不支持向左扩容。笔者这里的磁盘情况如下:其中磁盘1的99.5GB是我的Lin…

linux开机自启脚本运行完之后不关闭应用程序

最近在用petalinux2323.2版本编译的系统镜像,想在系统开机后自动运行程序,发现按照2021.2相同的方式启动之后,软件在开机脚本运行完就会自动退出了,经过查找发现petalinux2023.2编译的镜像默认使用的systemd去运行开机脚本,而2021.2是使用的init.d。在systemd方式下需要在…

读懂财务报表:解密资产负债率与净资产收益率

一、概述 财务报表中隐藏着大量的信息,如果我们在解读时缺乏系统的思路或忽略了关键指标,就很容易被庞杂的数据搞得不知所措。本文将从几个重要指标出发,包括资产负债率、净资产收益率和销售复合增长率的计算与分析,帮助大家更精准地理解财务报表。二、财务报表的重点 首先…

陶瓷基板

【附在每个笔记前面:个人学习记录,如有错误,烦请指正,不胜感激。】一、组成:基片+膜层(基于行业局限性,暂时只看金属化薄膜基板,厚膜下次找机会再学习下) ① 基片材质: 氧化铝、氮化铝、碳化硅、金刚石 受制于成形工艺:即烧型、研磨型、抛光型在公差、表面粗糙…

人工智能 | 结对编程助手GithubCopilot

简介 GitHub Copilot 是一款 AI 结对程序员,可帮助您更快、更少地编写代码。它从注释和代码中提取上下文,以立即建议单独的行和整个函数。GitHub Copilot 由 GitHub、OpenAI 和 Microsoft 开发的生成式 AI 模型提供支持。它可作为 Visual Studio Code、Visual Studio、Neovim…

iLogtail 开源两周年:感恩遇见,畅想未来

iLogtail 的诞生初衷非常朴素,那就是开发一款轻量、高性能、高可靠的可观测数据采集器。也是基于这样一个常见且迫切的需求,iLogtail 于 2013 年在阿里巴巴诞生。早在上世纪 60 年代,早期的计算机(例如 ENIAC 和 IBM 的大型机)在操作过程中会输出一些基本的状态信息和错误…

ant design vue 表格table 和复选框Checkbox结合 实现树形数据操作

前言:最近在做一个权限管理的页面,需要配置权限。业务给的要求在表格里,展示权限以及编辑权限。然后根据权限数组,动态展示模块。 页面需求:可以设定每个公司或者部门的单独权限,可以编辑保存权限 主要实现: 1.全选,反选(递归循环,every,some实现) 2.子级选中其父级…

TCP通信之经典问题解决

先看下面的代码,研究下执行后会出现什么? 服务端: from socket import * ip_port=(127.0.0.1,8003) buffer_size=1024sock_server=socket(AF_INET,SOCK_STREAM) sock_server.bind(ip_port) sock_server.listen(5)while True:print(服务端建立连接...)conn,addr=sock_server.…

看看人家那后端 API 接口写的,那叫一个优雅!

文章来源:https://www.toutiao.com/article/6694404645827117572 在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后…