首页 > 其他分享 >P7706 「Wdsr-2.7」文文的摄影布置

P7706 「Wdsr-2.7」文文的摄影布置

时间:2024-07-15 22:08:31浏览次数:7  
标签:res Wdsr Min Max rs 文文 P7706 ls max

题意

给定长度为 \(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;
}

标签:res,Wdsr,Min,Max,rs,文文,P7706,ls,max
From: https://www.cnblogs.com/y1wei/p/-/solution_Luogu_P7706

相关文章

  • SpringSecurity中文文档(Servlet Method Security)
    MethodSecurity除了在请求级别进行建模授权之外,SpringSecurity还支持在方法级别进行建模。您可以在应用程序中激活它,方法是使用@EnableMethodSecurity注释任何@Configuration类,或者将<method-security>添加到任何XML配置文件中,如下所示:@EnableMethodSecurity......
  • springcloud-gateway 网关组件中文文档
      SpringCloud网关GreenwichSR5该项目提供了一个基于Spring生态系统的API网关,其中包括:Spring5,SpringBoot2和项目Reactor。SpringCloud网关的目的是提供一种简单而有效的方法来路由到API,并向它们提供跨领域的关注,例如:安全性,监视/度量和弹性。  如......
  • 全新发布:AIDOCZH.com 推出 Langchain API参考中文文档,提升查阅API效率!
    全新发布:AIDOCZH.com推出LangchainAPI参考中文文档,提升查阅API效率!一、LangChainAPI中文文档1、从网站中进入http://www.aidoczh.com/langchain/v0.2/docs/introduction/2、直接网页进入http://www.aidoczh.com/langchain_api/html/langchain_api_reference.html......
  • 向量数据库Milvus快速入门——AIDOCZH.COM上线Milvus中文文档
    Milvus快速入门——AIDOCZH.COM上线Milvus中文文档文章目录Milvus快速入门——AIDOCZH.COM上线Milvus中文文档Milvus官方文档的中文翻译Milvus介绍什么是Milvus向量数据库?关键概念非结构化数据嵌入向量向量相似性搜索为什么选择Milvus?支持的索引和度量标准是什么?索......
  • Transformers--4-37-中文文档-四十五-
    Transformers4.37中文文档(四十五)原文:huggingface.co/docs/transformersOWL-ViT原文:huggingface.co/docs/transformers/v4.37.2/en/model_doc/owlvit概述OWL-ViT(VisionTransformerforOpen-WorldLocalization)是由MatthiasMinderer、AlexeyGritsenko、AustinSton......
  • Transformers--4-37-中文文档-四十四-
    Transformers4.37中文文档(四十四)原文:huggingface.co/docs/transformersLayoutLMv3原文链接:huggingface.co/docs/transformers/v4.37.2/en/model_doc/layoutlmv3概述LayoutLMv3模型由YupanHuang、TengchaoLv、LeiCui、YutongLu、FuruWei在LayoutLMv3:Pre-trai......
  • Transformers--4-37-中文文档-四十三-
    Transformers4.37中文文档(四十三)原文:huggingface.co/docs/transformersGIT原始文本:huggingface.co/docs/transformers/v4.37.2/en/model_doc/git概述GIT模型是由JianfengWang、ZhengyuanYang、XiaoweiHu、LinjieLi、KevinLin、ZheGan、ZichengLiu、CeLiu、L......
  • Transformers--4-37-中文文档-一-
    Transformers4.37中文文档(一)原文:huggingface.co/docs/transformers开始吧......
  • Transformers--4-37-中文文档-五-
    Transformers4.37中文文档(五)原文:huggingface.co/docs/transformers贡献贡献给......
  • Transformers--4-37-中文文档-四十一-
    Transformers4.37中文文档(四十一)原文:huggingface.co/docs/transformersAltCLIP原文链接:huggingface.co/docs/transformers/v4.37.2/en/model_doc/altclip概述AltCLIP模型是由陈忠志、刘光、张博文、叶福龙、杨庆红、吴乐德在AltCLIP:AlteringtheLanguageEncoder......