首页 > 其他分享 >P7706 文文的摄影布置 题解

P7706 文文的摄影布置 题解

时间:2024-08-21 19:04:02浏览次数:6  
标签:pr 题解 ll mid 文文 P7706 求值 pl op

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

标签:pr,题解,ll,mid,文文,P7706,求值,pl,op
From: https://www.cnblogs.com/adsd45666/p/18372350

相关文章

  • 一元柯西问题解法整理与试证明(傅里叶变换的应用)
    关于柯西问题:  柯西问题是指偏微分方程仅有初始条件而无边界条件的定解问题,常用特征线法、分离变量法、格林函数法以及傅里叶变换求解,柯西问题即对于  其中   为主函数, 为初始条件,求解U(x,t)关于傅里叶变换:公式:对于一维方程f(x)有    或  卷积:若,则......
  • [题解]P2444 [POI2000] 病毒
    P2444[POI2000]病毒题目核心是多模式匹配,所以考虑用对所有模式串建立AC自动机。我们把自动机上,存在一个模式串作为前缀的节点,称作“危险节点”。如果无限长的安全代码存在的话,匹配过程中Trie图上一定有节点会经过多次,即存在环;而且经过的所有节点都不是“危险节点”,否则就包含......
  • TCP通信之经典问题解决
    先看下面的代码,研究下执行后会出现什么?服务端:fromsocketimport*ip_port=('127.0.0.1',8003)buffer_size=1024sock_server=socket(AF_INET,SOCK_STREAM)sock_server.bind(ip_port)sock_server.listen(5)whileTrue:print('服务端建立连接...')conn,addr=soc......
  • P1972 [SDOI2009] HH的项链 题解
    前言这是一篇分块题解,大概的思路洛谷的题解里的巨佬讲的很清楚(我的思路其实和大佬的差不多),可以去看看qaq。因为苯人为了卡常魔改代码,所以在本题解的中间具体步骤展示部分仅展示魔改前的代码(也就是被卡常但是好看一点的代码),魔改后的代码(100pts)在文章最末展示。题意题面传送门......
  • 操作系统基础之磁盘及软考高级试题解析
    概述基本概念磁盘有正反两个盘面,每个盘面有多个同心圆,每个同心圆是一个磁道,每个同心圆又被划分为多个扇区,数据就被存在扇区中。磁头首先寻找到对应磁道,然后等到磁盘进行周期旋转到指定的扇区,才能读取到对应的数据。存取时间=寻道时间+等待时间盘面号(磁头号):0~M-1;由于一......
  • 信号量、PV操作及软考高级试题解析
    信号量在并发系统中,信号量是用于控制公共资源访问权限的变量。信号量用于解决临界区问题,使得多任务环境下,进程能同步运行。此概念是由荷兰计算机科学家Dijkstra在1962年左右提出的。信号量仅仅跟踪还剩多少资源可用,不会跟踪哪些资源是可用的。信号量机制,处理进程同步和互斥的问......
  • 题解:Codeforces Round 967 (Div. 2) B [思维/构造]
    B.GeneratePermutationtimelimitpertest:1.5secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputThereisanintegersequence\(a\)oflength\(n\),whereeachelementisinitially\(-1\).Misukihastwoty......
  • [ABC133D] Rain Flows into Dams 题解
    思路其实就是一道数学题。设每座山的水量为$ans_i$,大坝的水量为$w_i$,则根据题意可以得到以下方程:$$\begin{cases}w_i=\frac{ans_i+ans_{i+1}}{2}&i<n\w_i=\frac{ans_i+ans_1}{2}&i=n\end{cases}$$所以只要求出任意一个$ans$就可以求出剩余的$ans$,这里我选择求$ans_1$的......
  • CF1264D1 题解
    blog。写一个题解区没有的蠢做法,不依赖dp但是很难转到HardVersion(对于已经确定的序列,深度有单调性。就是如果答案为\(x\),那么肯定能选出深度为\(1\simx\)的子序列。记\(\operatorname{check}_s(x)\)表示check序列\(s\)能否选出深度为\(x\)的子序列。考虑如何c......
  • 题解:AT_abc140_e [ABC140E] Second Sum
    思路:双向链表+组合数学(不过你要用单调栈也没人拦着你)我们现在先抛开题面,先换个思路。我们现在求:这个数能做多少个区间的次大值。我们现在设\(l1,l2,r1,r2\)分别为左边第一个比这个数大的id,第二个比这个数大的id,右边第一个比这个数大的id,第二个比这个数大的id。竟然是......