题意

给定长度为 \(n\) 的数组 \(a\) 和 \(b\),支持单点修改,\(q\) 次区间查询 \(\max_{l\le i<k\le r} \{a_i + a_k - \min_{i<j<k}b_j\}\)。

\(n,q\le 5\times10^5,1\le a_i,b_i\le10^8\qquad\text{2s,256MB}\)

题解

考虑使用线段树维护信息。记 \(\psi(p)\) 表示线段树上节点 \(p\) 的答案,接下来要考虑如何根据左右子树的答案,更新当前节点的答案。

注意到答案和 \(i,j,k\) 三个位置有关,我们希望 \(a_i,a_k\) 尽量的大,\(b_j\) 尽量小,那么就需要维护区间 \(a\) 最大值,\(b\) 最小值。

然后是分类讨论,我们讨论 \(\psi(p)\) 最大时,它的 \(i,j,k\) 会落在什么位置:

  • \(i,j,k\) 均在左子树或均在右子树:直接取左右子树答案最大值。\(\psi(p) = \max(\psi(ls),\psi(rs))\)。
  • \(i,j\) 在左子树,\(k\) 在右子树:\(k\) 直接选右子树中 \(b_k\) 最大的,对于 \(i,j\),需要的是 \(\max_{i<j}a_i - b_j\)。
  • \(i\) 在左子树,\(j,k\) 在右子树:同上,\(i\) 选最大的,\(j,k\) 是 \(\max_{j<k}- b_j + a_k\)。

发现还需要维护 \(\max_{i<j}a_i - b_j\) 这样的信息,继续分类讨论:

  • \(i,j\) 在同一子树中:取左右子树最大值。
  • \(i\) 在左子树,\(j\) 在右子树:\(i\) 取左子树 \(a_i\) 最大值,\(j\) 取右子树 \(b_j\) 最小值。

对于 \(\max_{j < k}-b_j + a_k\),同样的讨论。

记第一种信息为 \(L(p)\),第二种信息为 \(R(p)\),\(a\) 最大为 \(Max(p)\),\(b\) 最小为 \(Min(p)\),我们就能整合出以下的式子:

\[Max(p) = \max(Max(ls),Max(rs)),Min(p) = \min(Min(ls),Min(rs))
\]
\[L(p) = \max\{L(ls),L(rs),Max(ls) - Min(rs)\},R(p) = \max{R(ls),R(rs), - Min(ls) + Max(rs)}
\]
\[\psi(p) = \max\{\psi(ls),\psi(rs),L(ls) + Max(rs),Max(ls) + R(rs)\}
\]

一环套一环,太牛了哥!


单点修改就是直接对 \(Min,Max\) 进行修改,更新信息;查询就把所有区间像上面的方式合并起来,复杂度是一只 \(\log\) 的。

时间复杂度 \(\mathcal{O}(n\log n)\),分块 \(\mathcal{O}(n\sqrt{n})\) 卡卡应该能过。


代码实现中,我们可以采取重载 \(+\) 运算进行信息的维护,这样就可以模仿区间加的方式维护信息:

XDT operator+ (XDT A){
XDT res;
res.l = min(l,A.l);
res.r = max(r,A.r);
res.Max = max(Max,A.Max);
res.Min = min(Min,A.Min);
res.L = max(max(L,A.L),Max - A.Min);
res.R = max(max(R,A.R),- Min + A.Max);
res.Ans = max(max(Ans,A.Ans),max(L + A.Max,Max + A.R));
return res;
}

完整代码如下:

#include <bits/stdc++.h>
using namespace std; const int N = 5e5 + 5; int n,q,a[N],b[N]; struct XDT{
int l,r;
int Ans,Max,Min,L,R;
XDT() { Ans = Max = Min = L = R = - 1e9; } XDT operator+ (XDT A){
XDT res;
res.l = min(l,A.l);
res.r = max(r,A.r);
res.Max = max(Max,A.Max);
res.Min = min(Min,A.Min);
res.L = max(max(L,A.L),Max - A.Min);
res.R = max(max(R,A.R),- Min + A.Max);
res.Ans = max(max(Ans,A.Ans),max(L + A.Max,Max + A.R));
return res;
} }t[N << 2]; #define ls p << 1
#define rs p << 1 | 1 void pushup(int p){
t[p] = t[ls] + t[rs];
} void build(int p,int l,int r){
if (l == r){
t[p].l = t[p].r = l;
t[p].Max = a[l];
t[p].Min = b[l];
return ;
}
int mid = (l + r) >> 1;
build(ls,l,mid), build(rs,mid + 1,r);
pushup(p);
} void modify1(int p,int x,int y){
if (t[p].l == t[p].r){
t[p].Max = y;
return ;
}
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) modify1(ls,x,y);
else modify1(rs,x,y);
pushup(p);
} void modify2(int p,int x,int y){
if (t[p].l == t[p].r){
t[p].Min = y;
return ;
}
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) modify2(ls,x,y);
else modify2(rs,x,y);
pushup(p);
} void query(int p,int l,int r,XDT &ans){
if (l <= t[p].l && t[p].r <= r)
return (void)(ans = ans + t[p]);
int mid = (t[p].l + t[p].r) >> 1;
if (l <= mid) query(ls,l,r,ans);
if (r > mid) query(rs,l,r,ans);
} int read(){
int x = 0; char ch = getchar();
while (ch < '0' || ch > '9'){
ch = getchar();
}
while ('0' <= ch && ch <= '9'){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x;
} int main(){
n = read(), q = read();
for (int i = 1;i <= n;i++) a[i] = read();
for (int i = 1;i <= n;i++) b[i] = read();
build(1,1,n);
while (q--){
int o = read(), l = read(), r = read();
XDT ans;
if (o == 1) modify1(1,l,r);
if (o == 2) modify2(1,l,r);
if (o == 3) query(1,l,r,ans), printf("%d\n",ans.Ans);
}
return 0;
}

P7706 「Wdsr-2.7」文文的摄影布置的更多相关文章

  1. 「查缺补漏」巩固你的Nginx知识体系

    Nginx篇 基本介绍 Nginx是一款轻量级的 Web服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是: 支持高并发连接,尤其是静态界面,官方测试Nginx能够 ...

  2. 「编程羽录」上线,程序员必备的这些技能你能get到嘛?

    大家好,我是小羽. 好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章. 会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全 ...

  3. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...

  4. macOS安装「oh my zsh」

    目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...

  5. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  6. 企业运营对 DevOps 的「傲慢与偏见」

    摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...

  7. 「前端开发者」如何把握住「微信小程序」这波红利?

    由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...

  8. 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣

    「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!

  9. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

  10. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

随机推荐

  1. 直接给一个数组项赋值,Vue 能检测到变化吗?

    由于 JavaScript 的限制,Vue 不能检测到以下数组的变动: 当你利用索引直接设置一个数组项时,例如: vm.items[indexOfItem] = newValue 当你修改数组的长度时 ...

  2. Idea 2020.1 编译SpringBoot项目Kotlin报错

    导读 今天公司有个项目莫名其妙的运行不起来,提示Kotlin版本兼容问题,网上找到解决方案后,整理下来. 错误信息 Error:Kotlin: Module was compiled with an ...

  3. Maven Helper插件——实现一键Maven依赖冲突问题

    业余在一个SpringBoot项目集成Swagger2时,启动过程一直出现以下报错信息-- An attempt was made to call a method that does not exi ...

  4. 小程序-浅谈云函数获取数据和云数据库api获取数据的区别

    区别:在于条数的限制,云数据库api获取数据限制20条以内,云函数限制100条以内 index.wxml <button bindtap="shujukuget">数据 ...

  5. windows内置账户

    参考文献: http://www.cnblogs.com/xianspace/archive/2009/04/05/1429835.html 转载自: https://www.cnblogs.com/ ...

  6. webpack4.15.1 学习笔记(四) — Tree shaking

    目录 Tree shaking 原理 标记效果 副作用代码不可被删除 如何实现 Tree shaking 的几种方法 总结 Tree shaking 本质上为了消除无用的js代码,减少加载文件体积的方 ...

  7. Sonar 扫描之分析参数介绍

    Sonar扫描之分析参数介绍 强制参数 服务器 Key 描述 默认 sonar.host.url 服务器网址 http://localhost:9000 项目配置 Key 描述 默认 sonar.pr ...

  8. Django 多数据库配置与使用总结

    Django 多数据库配置与使用总结 By:授客 QQ:103355122 #实践环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址: https:/ ...

  9. 很呆的一个问题:我的新项目又找不到mapper这个bean了

    1.选springboot版本 <properties> <java.version>8</java.version> <project.build.sour ...

  10. 2023/4/19 SCRUM个人博客

    1.我昨天的任务 初步了解了pandas库,对series和dataframe有了初步的学习使用 2.遇到了什么困难 对PYQT5的概念没有定义,准备进行学习 3.我今天的任务 学习了PYQT5的部分 ...