P7706 文文的摄影布置 题解
P7706 文文的摄影布置 题解
读完题,发现是线段树。单点修改+区间查询。
不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个 ψ 值(下称待求值)。
对于一个区间的待求值,大概有四种情况:

如上图四种情况分别为:
- 待求值最大值在左区间
- 待求值最大值在右区间
- \(a_i与b_j\) 在左区间
- \(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;
}
P7706 文文的摄影布置 题解的更多相关文章
- 洛谷 P1854 花店橱窗布置 题解
Analysis 给定一个f*v的矩阵 要求从第一行走到第f行,每行取走一个数, 且该行所取的数必须必上一行所取的数的列数大 , 求所能取走的最大值 注意每一行所取走的数字的列数必须大于等该行的行号 ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- 【文文殿下】 [USACO08MAR]土地征用 题解
题解 斜率优化裸题. 有个很玄学的事情,就是我用\(f[i]=min\{f[j-1]+p[j].y*p[i].x\}\) 会很奇怪的Wa . 明明和\(f[i]=min\{f[j]+p[j+1].y* ...
- 【文文殿下】 [SDOI2013]保护出题人 题解
题解 我们把伤害-时间图像画出来.然后维护一下僵尸血量的前缀和.最好情况肯定是有一个僵尸恰好死在戴夫家门口.我们把原点到其他n个点的斜率最大的一个累积到答案. 发现每添加一个点,其他所有点的坐标都变了 ...
- 【文文殿下】[CEOI2004]锯木厂选址 题解
题解 我们枚举建厂的位置,发现有个\(n^2\)的DP.随手搞个斜率优化到\(O(n)\). #include<bits/stdc++.h> using namespace std; ty ...
- 【文文殿下】CF1098C Construct a tree 题解
题解 挺水的一道题. Rating $ \color{orange} {2300}$ 以下送命题. 首先我们知道,所有子树大小之和就是节点个数加上从根到所有节点的路径长度之和. 他要求度数尽可能小,所 ...
- 【文文殿下】[APIO2010]特别行动队 题解
基本上是一个斜率优化裸题了 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int max ...
- 题解 P1854 花店橱窗布置
把二维压成一维的DP了解一下... 传送门 (以纪念神经兮兮调了两天的一维DP(刷水题谋财害命)以及感谢学长的帮助@ydnhaha) 显然我们有二维的dp:f[i][j]代表第i盆花放到第j个位置 ; ...
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码
Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体 ...
- 【SP26073】DIVCNT1 - Counting Divisors 题解
题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...
随机推荐
- 使用 Spring 实现控制反转和依赖注入
使用 Spring 实现控制反转和依赖注入 概述 在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们. 什么是控制反转? 控制反转是软件工程中的一个原 ...
- 搭建hadoop集群关键步骤--以三节点为例
搭建三节点的hadoop集群: 要求: 主机名称 备注 IP地址 功能 hadoop01 Master 主节点 192.168.211.134 NameNode.DataNode.ResourceMa ...
- React中的Ref
React中ref是一个对象,它有一个current属性,可以对这个属性进行操作,用于获取DOM元素和保存变化的值.什么是保存变化的值?就是在组件中,你想保存与组件渲染无关的值,就是JSX中用不到的或 ...
- P9210 题解
学长给我们讲了就顺便来写一篇题解. 首先最优解一定包括根,不然一定可以从当前根连接一条到根的链. 然后考虑假若最大导出子树深度为 \(n\) 则显然可以把深度为 \(n\) 的节点全部选上,然后每个节 ...
- SpringBoot Maven查看依赖树
dependency:tree -f pom.xml
- [Java SE] Java-文件系统-常用文件路径的获取方法
1 获取相对路径 /** * 获取相对路径 [推荐] * 使用Java提供的Path类和Paths类来获取相对路径. * 例如,假设有两个路径a和b,我们可以使用Path类的relativize()方 ...
- Zabbix 5.0 LTS URL 健康监测
更多细节详情看[zabbix官方文档] 需求 Zabbix 的URL健康监测功能允许你检测 Web 地址是否可用.正常工作以及响应速度.这对于监控网站的可用性和性能非常有用.例如,你可以监控公司网站. ...
- Windows下git配合Unity要设置autocrlf=false
Unity的.asset文件的换行符一定是Unix (LF)格式的,哪怕在设置里选了用Windows (CRLF)也没用,这个选项只对创建的C# Script有效. 这些Unix换行文件提交上去没问题 ...
- Windows 10 LTSC启用Microsoft Store的方法
新建msreg.bat文件,并编辑内容如下: ========== @echo off :: BatchGotAdmin :------------------------------------- ...
- [oeasy]python0007_ print函数_字符串_display_电传打字机_程序员的浪漫
你好世界 回忆上次内容 上次 想输出 Hello world! 据说是程序猿的浪漫 键盘按键 作用 ↑ 上一条指令 ↓ 下一条指令 ← 光标 向左移动 一格 → 光标 向右移动 一格 ctrl + ...