首页 > 其他分享 >【题解】Luogu[P7706] 「Wdsr-2.7」文文的摄影布置

【题解】Luogu[P7706] 「Wdsr-2.7」文文的摄影布置

时间:2023-09-02 17:34:47浏览次数:40  
标签:Wdsr int 题解 tree mid 文文 答案 区间 op

Link

一道很有意思的线段树题。

第一步分析,我们要求最大的 \(a_i+a_k-\min{(b_j)}\),事实上我们可以直接省去这个 \(\min\) 因为要最大化这个东西,选出来的 \(b_j\) 必然是最小的,所以原题转化为给定 \(l,r\) 求 \(\max{(a_i-b_j+a_k)}\) 其中 \(i<j<k\)。

第二步分析,我们发现这是一个单点修改、区间查询的问题,遇到这种问题一般都从区间合并入手,我们考虑怎么合并两个区间。

将左右两个区间合并成上面一个大区间,我们有四种情况:

  1. \(i,j,k\) 均在左区间,那么答案即为左区间答案。
  2. \(i,j,k\) 均在右区间,那么答案即为右区间答案。
  3. \(i,j\) 在左区间,\(k\) 在右区间,那么答案即为左区间中最大的 \(a_i-b_j\ (i<j)\) 加上右区间中最大的 \(a_k\)。
  4. \(i\) 在左区间,\(j,k\) 在右区间,那么答案即为左区间中最大的 \(a_i\) 加上右区间中最大的 \(-b_j+a_k\ (j<k)\)。

发现我们很好用线段树维护 1、2 种情况和 3 的右区间和 4 的左区间。

第三步分析,我们需要维护 3 情况的左区间和 4 情况的右区间。

以 3 情况左区间为例,我们同样分成两个小区间,看如何合并:

  1. \(i,j\) 均在左区间,那么答案即为左区间答案。
  2. \(i,j\) 均在右区间,那么答案即为右区间答案。
  3. \(i\) 在左区间 \(j\) 在右区间,那么答案即为左区间中最大的 \(a_i\) 减去右区间中最小的 \(b_j\)。

4 情况的右区间同理。

于是我们发现,我们很容易就能用线段树维护区间中的最大 \(a_i\) 与区间中最小的 \(b_j\) 了。

于是这道题的各种信息就很好的用线段树维护了。

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(P) (P<<1)
#define rs(P) (P<<1|1)
const int inf=1e9,NR=5e5+5,SZ=4*NR;
int n,m;
int a[NR],b[NR];
struct node{
    int mxa,mnb,ij,jk,w;
    node():mxa(-inf),mnb(inf),ij(-inf),jk(-inf),w(-inf){}
}tree[SZ];
node operator +(node l,node r){
    node res;
    res.mxa=max(l.mxa,r.mxa),res.mnb=min(l.mnb,r.mnb);
    res.ij=max(max(l.ij,r.ij),l.mxa-r.mnb),res.jk=max(max(l.jk,r.jk),r.mxa-l.mnb);
    res.w=max(max(l.w,r.w),max(l.ij+r.mxa,l.mxa+r.jk));
    return res;
}
void bld(int l,int r,int p){
    if(l==r){tree[p].mxa=a[l],tree[p].mnb=b[l];return;}
    int mid=l+r>>1;
    bld(l,mid,ls(p)),bld(mid+1,r,rs(p));
    tree[p]=tree[ls(p)]+tree[rs(p)];
}
void mfy(int l,int r,int x,int p){
    if(l==r){tree[p].mxa=a[l],tree[p].mnb=b[l];return;}
    int mid=l+r>>1;
    if(x<=mid)mfy(l,mid,x,ls(p));
    else mfy(mid+1,r,x,rs(p));
    tree[p]=tree[ls(p)]+tree[rs(p)];
}
void qry(int l,int r,int s,int t,int p,node &num){
    if(s<=l&&r<=t){num=num+tree[p];return;}
    int mid=l+r>>1;
    if(s<=mid)qry(l,mid,s,t,ls(p),num);
    if(t>mid)qry(mid+1,r,s,t,rs(p),num);
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>a[i];
    for(int i=1;i<=n;++i)cin>>b[i]; 
    bld(1,n,1);
    for(int i=1;i<=m;++i){
        int op,x,y;cin>>op>>x>>y;
        node res;
        if(op==1)a[x]=y,mfy(1,n,x,1);
        if(op==2)b[x]=y,mfy(1,n,x,1);
        if(op==3)qry(1,n,x,y,1,res),cout<<res.w<<endl;
    }
    return 0;
}

标签:Wdsr,int,题解,tree,mid,文文,答案,区间,op
From: https://www.cnblogs.com/agrumestly/p/17673944.html

相关文章

  • 【题解】Educational Codeforces Round 153(CF1860)
    每次打都想感叹一句,Educational名不虚传。A.NotaSubstring题目描述:有\(t\)组数据,对于每一组数据,你需要判断能否构造一个只由左右括号组成且长度为已经给定字符串的\(2\)倍且已经给定的字符串不是子串的合法字符串。注:合法的字符串是左右括号能完全匹配的字符串。如果能,......
  • 【题解】Luogu-P2482 SDOI2010 猪国杀
    写了\(358\)行,\(11.94\mathrm{KB}\),有这么几个地方写挂了:反猪决斗一定选主猪。游戏结束判定是主猪死亡或全部反猪死亡。决斗可能被反杀,之后不能再出牌。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn,m;charCh[3];queue<char>Deck;in......
  • CF1863C 题解
    CF1863CMEXRepetition题解Links洛谷CodeforcesDescription给你一个长度为\(n\)的序列\(a\),满足\(\foralli\in[1,n]\),\(0\leqa_{i}\leqn\)且序列中的数互不相同。定义一次操作为:按照\(i\)从\(1\)到\(n\)的顺序,\(a_{i}\gets\operatorname{MEX}(a_{1}......
  • CF1863B 题解
    CF1863BSplitSort题解Links洛谷CodeforcesDescription给定一个\(1\simn\)的排列\(q\),你可以多次进行以下操作:新建一个初始为空的序列\(q\);选择一个整数\(x\)(\(2\leqx\leqn\));按照在\(p\)中出现的顺序将所有小于\(x\)的数添加到序列\(q\)末尾。按照在......
  • P1463 [POI2001] [HAOI2007] 反素数 题解
    P1463[POI2001][HAOI2007]反素数题解可以发现,最大的不超过\(n\)的反素数就是\(1\simn\)中因数最多的数字。证明:设\(x,x\in[1,n]\)为\(1\simn\)中因数最多的数字,则\(x<y\len\)都不会成为答案,因为存在\(x<y\)因数比\(y\)多,同时也不会存在\(y'<x\)......
  • vmware中的疑难问题解决方法
    converter在windows中使用的agent服务端口9089,vcenter使用443端口。converter再windows中不能启动服务的解决方法:1.开启TLS1.01.11.2。在programdata中更改SSLOPTIONS的值为:56313856。可以尝试官方方法2.禁用网络连接:在注册表中localmachine-system-currentcontrolset-contro......
  • CF 1863D 题解
    CF1863DTwo-ColoredDominoes题解Links洛谷CodeforcesDescription有一个\(n\timesm\)的棋盘,上面铺着一些\(1\times2\)的多米诺骨牌(横竖均有可能),骨牌之间没有重叠。你需要找到一种染色方案满足以下条件:每个多米诺骨牌一端被染白,另一端被染黑。其他没有骨牌的格子......
  • 题解 [AGC004D] Teleporter
    题目链接躺在床上想到重要性质的题目。。。首先,由于每个城市只有一个可以直接到达的城市,所以\(n\)个城市就有\(n\)条边,容易发现这是一棵基环树,那么我们先从普通树的角度考虑,若要求每个点走\(k\)条边恰好到\(1\)号节点,这个环必须加在哪里。若\(k=1\),没有环显然也是可行......
  • GCD Counting题解
    题意有一棵有\(n\)个节点的树,第\(i\)个节点有点权\(a_i\)。定义\(g(x,y)\)为\(x\)到\(y\)的树上路径所经过的点的点权\(\gcd\)。对于每一个正整数\(k\in[1,2\times10^5]\)求出满足以下条件的\(x,y\)的对数:\(1\lex\ley\len\)\(g(x,y)=k\)\(1\len......
  • CF915G Coprime Arrays 题解
    题意给定\(n,k\),对于所有的\(m\in\left[1,k\right]\),求长度为\(n\),值域为\(\left[1,m\right]\)且最大公约数为\(1\)的序列种数,对\(10^9+7\)取模。(\(1\len,k\le2\times10^6\))。题解设\(f(d,m)\)表示长度为\(n\),值域为\(\left[1,m\right]\)且最大......