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

P7706 文文的摄影布置 题解的更多相关文章

  1. 洛谷 P1854 花店橱窗布置 题解

    Analysis 给定一个f*v的矩阵 要求从第一行走到第f行,每行取走一个数, 且该行所取的数必须必上一行所取的数的列数大 , 求所能取走的最大值 注意每一行所取走的数字的列数必须大于等该行的行号 ...

  2. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  3. 【文文殿下】 [USACO08MAR]土地征用 题解

    题解 斜率优化裸题. 有个很玄学的事情,就是我用\(f[i]=min\{f[j-1]+p[j].y*p[i].x\}\) 会很奇怪的Wa . 明明和\(f[i]=min\{f[j]+p[j+1].y* ...

  4. 【文文殿下】 [SDOI2013]保护出题人 题解

    题解 我们把伤害-时间图像画出来.然后维护一下僵尸血量的前缀和.最好情况肯定是有一个僵尸恰好死在戴夫家门口.我们把原点到其他n个点的斜率最大的一个累积到答案. 发现每添加一个点,其他所有点的坐标都变了 ...

  5. 【文文殿下】[CEOI2004]锯木厂选址 题解

    题解 我们枚举建厂的位置,发现有个\(n^2\)的DP.随手搞个斜率优化到\(O(n)\). #include<bits/stdc++.h> using namespace std; ty ...

  6. 【文文殿下】CF1098C Construct a tree 题解

    题解 挺水的一道题. Rating $ \color{orange} {2300}$ 以下送命题. 首先我们知道,所有子树大小之和就是节点个数加上从根到所有节点的路径长度之和. 他要求度数尽可能小,所 ...

  7. 【文文殿下】[APIO2010]特别行动队 题解

    基本上是一个斜率优化裸题了 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int max ...

  8. 题解 P1854 花店橱窗布置

    把二维压成一维的DP了解一下... 传送门 (以纪念神经兮兮调了两天的一维DP(刷水题谋财害命)以及感谢学长的帮助@ydnhaha) 显然我们有二维的dp:f[i][j]代表第i盆花放到第j个位置 ; ...

  9. 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码

    Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体 ...

  10. 【SP26073】DIVCNT1 - Counting Divisors 题解

    题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...

随机推荐

  1. Apache Kylin(二)在EMR上搭建Kylin

    EMR上搭建kylin 1. 启动EMR集群 根据官网说明: http://kylin.apache.org/docs21/install/kylin_aws_emr.html 启动EMR时,若是 h ...

  2. Linux 网络编程的5种IO模型 总结

    背景 在网络编程中,经常会用到一些模型,在这里做一下总结. 正文 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO 这是最简单的模型,一般配合多线程来实现. Linux 网络编程的5种IO模型 ...

  3. Oracle自动化编译无效对象

    问题描述:使用存储过程的方式对oracle数据库的无效对象,如视图或者同义词进行定期的编译,让他变成一个有效的对象,加上定时任务可以实现自动化的处理.同时在数据库内部创建一个记录表,用来记录被编译过的 ...

  4. ARM+DSP!全志T113-i+玄铁HiFi4开发板硬件说明书(1)

    前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板.由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感 ...

  5. 广播变量的使用-----通过ip查询属于哪个省份

    1,为什么要使用广播变量? 举一个简单的例子,我们要处理一份log文件,里面有ip地址. 20090121000132095572000|125.213.100.123|show.51.com|/sh ...

  6. Mac mysql 5.7.x 设置服务开机自启动

    在终端输入 sudo vi /Library/LaunchDaemons/com.mysql.mysql.plist 输入以下内容 <?xml version="1.0" e ...

  7. TIOBE 7月编程排行榜出炉!Python再次出圈

    又到了周三,本周有过半了,大家好呀 ~~ 每月的TIOBE编程排行榜都是技术社区关注的焦点,作为编程语言流行度的晴雨表,它反映了行业趋势和 技术走向.2024年7月的榜单揭晓了一个重要变化:Pytho ...

  8. 使用gzexe加密shell脚本

    使用 gzexe 加密 shell 脚本是一个相对简单的过程.以下是具体的步骤: 编写你的 shell 脚本:首先,你需要有一个 shell 脚本文件,比如 myscript.sh. 确保脚本可执行: ...

  9. oeasy教您玩转vim - 60- # vim选项

    ​ vim选项 从头开始 这次我们从头开始 从进入vim之前开始 我们可以在终端里面给vim怎么样的参数呢? man vim 这个如果不行的话 要先运行unminimize更新manual 也可以在v ...

  10. 只会建数据库怎么写API?database2api 能帮到你!

    database2api 意为 DataBase to API,即只要有数据库,就可以生成开放 API. database2api 是一款强大而便捷的工具,主要功能是依据现有的数据库自动生成开放的 A ...