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\ ...
随机推荐
- docker配置域名
先运行docker镜像 # 进入 docker 容器 mynginx 是容器名 docker exec -i -t mynginx /bin/bash #安装vim apt-get install v ...
- 【Autoware】Autoware安装教程
此篇主要是从自己的csdn copy 在博客园上备份一下哈~ 前提:大家需要换源[软件源和pip源]:git clone的时候走博主给的Gitee的链接吧 不然得等个十万年... 如果想看最终是啥样的 ...
- 通过vscode写博客
通过Vscode写博客到博客园 前言 在以前的写作方式都是通过博客园内置的markdown进行工作,但是在实际使用过程中,感觉不是很方便,所以找到了用VSCode插件写作的方法. 所需插件 博客园Cn ...
- THM-Skynet-Writeup
通过学习相关知识点:攻破Linux目标机器并完成提权操作. 部署并渗透目标机器 step1 使用Nmap扫描端口 nmap -p- -sC -sV -T4 -v 10.10.164.81 139/44 ...
- Three光源Target位置改变光照方向不变的问题及解决方法
0x00 楔子 在 Three.js 中,光源的目标(target)是一种用于指定光源方向的重要元素.在聚光灯中和定向光(DirectionalLight)中都有用到. 有时我们可能会遇到光源目标位置 ...
- [oeasy]python0054_三引号_原样显示字符串_triple_quoted
三引号 回忆上次内容 \ 首先是转义字符 可以 和别的字符 构成转义序列 \a是 ␇ (bell), \b 退回一格 \t 水平制表符 \v.\f LineFeed \\ 输出 \ \" 输 ...
- ASP.NET Core 程序集注入(二)
public void ConfigureServices(IServiceCollection services) { string strValue = Configuration.GetSect ...
- 题解:P8144 [JRKSJ R4] BBWWBB
思路 分析题意可得,白方必定不会胜利,只能尽量让游戏无限进行下去.那么我们只考虑黑方能否胜利. 若想让戏能无限进行下去,必须满足以下条件. 白方先手. 若黑方先手必然可以吃掉一个白方,白方仅有一个棋子 ...
- Figma 替代品 Excalidraw 安装和使用教程
如今远程办公盛行,一个好用的在线白板工具对于团队协作至关重要.然而,市面上的大多数白板应用要么功能单一,要么操作复杂,难以满足用户的多样化需求.尤其是在进行头脑风暴.流程设计或产品原型绘制时,我们常常 ...
- 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便
自动化测试中,QTP和selenium IDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制.个人觉得传统录制工具有些弊端,加上要定 ...