2024杭电多校(4)1012. 寻找宝藏 【扫描线、树状数组二维偏序】

news2025/1/12 16:13:09

寻找宝藏

题意

1

2

思路

如果没有矩形陷阱区域的话,设 f i f_i fi 表示从 ( 0 , 0 ) (0, 0) (0,0) ( i , p i ) (i, p_i) (i,pi) 的最大收益,那么可以很容易通过扫描线 + d p dp dp 求出: f i = v i + max ⁡ j < i ∧ p j < p i f j f_i = v_i + \max_{j < i \wedge p_j < p_i} f_j fi=vi+maxj<ipj<pifj,我们只需要按照横坐标从小到大加点,对于当前的 x = i x = i x=i,我们在树状数组上查询 [ 1 , p i − 1 ] [1, p_i - 1] [1,pi1] 的最大值即可。这是很典型的处理二维偏序的方法:先固定一维,再在数据结构上查询另外一维
同理,反过来我们也可以得到 g i g_i gi 表示 ( i , p i ) (i, p_i) (i,pi) ( n + 1 , n + 1 ) (n + 1, n + 1) (n+1,n+1) 的最大收益

那么经过某个点 ( i , p i ) (i, p_i) (i,pi) 的最大收益是: h i = f i + g i − v i h_i = f_i + g_i - v_i hi=fi+givi

现在对于一个矩形区域 [ x 1 , x 2 ] × [ y 1 , y 2 ] [x_1, x_2] \times [y_1, y_2] [x1,x2]×[y1,y2],答案来自以下四种情况之一:

3

  1. 经过某个位于 [ x 2 + 1 , n ] × [ 1 , y 1 − 1 ] [x_2 + 1, n] \times [1, y_1 - 1] [x2+1,n]×[1,y11] 的点 x x x(上图红点),答案为 h x h_x hx
  2. 经过某个位于 [ 1 , x 1 − 1 ] × [ y 2 + 1 , n ] [1, x_1 - 1] \times [y_2 + 1, n] [1,x11]×[y2+1,n] 的点 x x x(上图绿点),答案为 h x h_x hx
  3. 先经过 [ 1 , x 2 ] × [ 1 , y 1 − 1 ] [1, x_2] \times [1, y_1 - 1] [1,x2]×[1,y11] 的某一个点 a a a,再经过 [ x 2 + 1 , n ] × [ y 1 , n ] [x_2 + 1, n] \times [y_1, n] [x2+1,n]×[y1,n] 的某一个点 b b b(先右后上),答案为 f a + g b f_a + g_b fa+gb
  4. 先经过 [ 1 , x 1 − 1 ] × [ 1 , y 2 ] [1, x_1 - 1] \times [1, y_2] [1,x11]×[1,y2] 的某一个点 a a a,再经过 [ x 1 , n ] × [ y 2 + 1 , n ] [x_1, n] \times [y_2 + 1, n] [x1,n]×[y2+1,n] 的某一个点 b b b(先上后右),答案为 f a + g b f_a + g_b fa+gb

可以发现上面四种情况我们都可以通过扫描线处理处理出来,最后答案取 max ⁡ \max max 即可

归类一下,我们可以先从小到大处理 x x x 坐标,先求出 f f f 的同时,把符合约束的 f x f_x fx 加入到特定的矩形的第 3 , 4 3,4 3,4 种情况的第一个参数中

反过来,我们求出 g g g 的同时,将符合约束的 g x g_x gx 加入到对应矩形的第 3 , 4 3,4 3,4 种情况的第二个参数中

最后有了 f f f g g g 的值之后,我们就可以顺序和倒序再扫描一次,处理 h h h 和第 1 , 2 1,2 1,2 种情况的值了

时间复杂度: ( n + m ) log ⁡ n (n + m) \log n (n+m)logn

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;
#define lowbit(x) ((x) & -(x))

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

const int N = 300005;

struct Point{
    int x;
    int y;
    int v;
};

struct Mat{
    Point p1;
    Point p2;
    int id;
};

ll f[N], g[N];
ll fen[N];
int n, m;

void update(int p, ll val){
    while(p <= n){
        fen[p] = std::max(fen[p], val);
        p += lowbit(p);
    }
}

ll query(int p){
    ll res = 0;
    while(p > 0){
        res = std::max(res, fen[p]);
        p -= lowbit(p);
    }
    return res;
}

inline void clear(){
    fore(i, 1, n + 1) //clear
        fen[i] = 0;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t;
    std::cin >> t;
    while(t--){
        std::cin >> n >> m;
        std::vector<Point> a(n);
        std::vector<Mat> b(m);
        std::vector<std::vector<int>> gl(n + 1), gr(n + 1); //扫描线活动
        std::vector<std::array<ll, 4>> ans(m);
        fore(i, 0, n){
            std::cin >> a[i].y >> a[i].v;
            a[i].x = i + 1;
        }
        fore(i, 0, m){
            int x1, y1, x2, y2;
            std::cin >> x1 >> y1 >> x2 >> y2;
            b[i] = {{x1, y1}, {x2, y2}, i};
            gl[x1].push_back(i); //分别在左右边界加入扫描线活动
            gr[x2].push_back(i);
        }

        for(auto [x, y, v] : a){
            ll mx = query(y - 1);
            f[x] = mx + v;
            for(auto id : gl[x]) ans[id][3] = query(b[id].p2.y); //ur
            update(y, f[x]); //更新
            for(auto id : gr[x]) ans[id][2] = query(b[id].p1.y - 1); //ru
        }
        clear();

        for(int i = n - 1; i >= 0; --i){
            auto [x, y, v] = a[i];
            ll mx = query(n - y);
            g[i + 1] = mx + v;
            for(auto id : gr[x]) ans[id][2] += query(n - b[id].p1.y + 1);
            update(n - y + 1, g[i + 1]);
            for(auto id : gl[x]) ans[id][3] += query(n - b[id].p2.y);
        }
        clear();

        for(int i = n - 1; i >= 0; --i){
            auto [x, y, v] = a[i];
            for(auto id : gr[x]) ans[id][0] = query(b[id].p1.y - 1);
            update(y, f[x] + g[x] - v);
        }
        clear();

        for(auto [x, y, v] : a){
            for(auto id : gl[x]) ans[id][1] = query(n - b[id].p2.y);
            update(n - y + 1, f[x] + g[x] - v);
        }
        clear();
        
        for(auto [v1, v2, v3, v4] : ans) std::cout << std::max({v1, v2, v3, v4}) << endl;
    }
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1959478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

颜色识别基于高斯混合模型(GMM)的查找表分类器(LUT)

文章目录 create_class_gmm 创建高斯混合模型&#xff08;GMM&#xff09;以进行分类任务add_samples_image_class_gmm 提取训练样本&#xff0c;并将其添加到高斯混合模型 (GMM) 的训练数据集中train_class_gmm 训练一个高斯混合模型 (GMM)clear_class_gmm 清除模型create_cla…

车载客流统计大揭秘——双目客流统计

客流统计大揭秘——双目客流统计 随着科技的飞速发展和商业竞争的加剧&#xff0c;客流统计已成为商业运营中不可或缺的一环。在众多客流统计技术中&#xff0c;双目客流统计以其高精度和高效率逐渐受到广大商家的青睐。本文将带您一探双目客流统计的奥秘。 一、什么是双目客流…

axure10的安装与使用教程,问题整理

前言&#xff1a; axure10的安装与激活使用教程。 1、百度网盘下载相关资料 链接&#xff1a;https://pan.baidu.com/s/1OSD9J1wVuIptGxeRzwjlpA?pwddkbj 提取码&#xff1a;dkbj 2、开始安装&#xff0c;点击setup的安装包 除了更改地址外&#xff0c;其他的默认就行&…

平台总线驱动和设备的匹配流程分析

参考文章:https://blog.csdn.net/qq_44182115/article/details/123231576 1、宏module_platform_driver // include/linux/platform_device.h 展开为 static int __init __platform_driver_init(void) \ {\return platform_driver_register(&

谷粒商城实战笔记-84-商品服务-API-新增商品-获取分类关联的品牌

文章目录 一&#xff0c;品牌查询接口的后台实现二&#xff0c;编码经验总结1&#xff0c;Controller层的作用1.1 参数处理1.2 调用Service1.3 处理Service返回结果实例 2&#xff0c;VO的封装时机3&#xff0c;Service中最好注入Service&#xff0c;不要直接依赖Dao 问题记录 …

BUGKU-CTF-WEB 源代码

URL解码平台&#xff1a;https://www.iamwawa.cn/urldecode.html 看看源码 存在script&#xff1a; <script> var p1 %66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65…

基于Gunicorn、Flask和Docker的高并发应用部署指南

一、简介 随着互联网的发展&#xff0c;现代应用程序需要处理越来越多的并发请求&#xff0c;高并发应用程序的需求促使开发者寻找可靠且高效的解决方案来管理和优化服务器负载。在这种背景下&#xff0c;Gunicorn、Flask和Docker成为构建和部署高并发应用的理想组合。 首先&…

一分钟了解VMware虚拟机三种网络模式区别

VMware虚拟机提供了三种主要的网络模式&#xff0c;分别是桥接模式&#xff08;Bridged Mode&#xff09;、网络地址转换模式&#xff08;NAT Mode&#xff09;和仅主机模式&#xff08;Host-Only Mode&#xff09;。这三种模式各有其特点和适用场景&#xff0c;以下是对它们之…

mysql的回表查询

大家好&#xff0c;我是程序媛雪儿&#xff0c;今天咱们聊mysql的回表查询&#xff0c;在mysql慢查询那篇文章中我们知道&#xff0c;当extra那一列显示&#xff0c;Using index condition&#xff0c;表示直接使用了索引&#xff0c;但是需要回表查询数据&#xff0c;这种情况…

GaussDB关键技术原理|高可用:逻辑复制

GaussDB关键技术原理|高可用&#xff1a;DCF&双集群容灾从DCF与双集群容灾技术两方面对GaussDB的高可用能力进行了介绍&#xff0c;本篇将从逻辑复制方面继续解读GaussDB高可用能力。 目录 3 逻辑复制 3.1 基本概念 3.2 逻辑解码 3.3 备机解码 3.4 并行解码 3.5 一致…

docker中使用nginx配置https访问

1.申请ssl证书: https://www.joyssl.com/certificate/select/free.html 免费的ssl证书&#xff08;一般有效期是90天&#xff09;到期后&#xff0c;则需要重新申请 申请完之后下载证书 然后到验证信息中 然后到自己的域名控制台 添加解析记录(这是ssl相关的,后面还要添加自…

电测量数据交换DLMSCOSEM组件第53部分:DLMSCOSEM应用层(上)

1.范围 本部分规定了DLMS/COSEM客户机和服务器的DLMS/COSEM应用层的结构、服务和协议。同时,定义规则规定DLMS/COSEM通信配置。 它定义了用于建立和释放应用程序连接的服务,以及用于访问GB/T17215.662中使用逻辑名称(LN)或短名称(SN)引用定义的COSEM接口对象的方法和属性…

Django实战:开启数字化任务管理的新纪元

&#x1f680; Django实战&#xff1a;开启数字化任务管理的新纪元 &#x1f310; &#x1f4d6; 引言 在数字化转型的浪潮中&#xff0c;任务管理的智能化成为提升组织效能的关键。今天&#xff0c;我将带领大家深入了解我们最新开发的OFTS系统——一款创新的组织任务管理软…

【算法刷题日志】信封嵌套问题

俄罗斯套娃信封问题 信封嵌套问题可以转换为最长递增子序列的问题。每次合法的嵌套都是大的套小的&#xff0c;就相当于找一个最长递增子序列&#xff0c;长度就是能嵌套的最多个数&#xff0c;所以我们可以先对宽度进行升序排序&#xff0c;如果宽度相同就按高度降序排序&…

动态SLAM:如何判断一个特征是动态特征(对极几何)

文章目录 1.什么是极线、极点和极面2.如何判断其为动态点特征3.如何判断其为动态线特征 1.什么是极线、极点和极面 由图可知&#xff0c;C1,C2,X(X1,X2)组成了一个三角平面&#xff0c;这个三角所在的平面就是极面 在这个极平面中&#xff0c;和成像平面相交的线是极线&#xf…

“2024青岛软博会”助力打造“世界工业互联网之都”

在数字经济浪潮的推动下&#xff0c;青岛国际软件融合创新展&#xff08;简称青岛软博会&#xff09;作为年度科技盛宴&#xff0c;不仅全面展示了青岛软件产业发展的辉煌成果&#xff0c;更聚焦于工业软件这一核心领域&#xff0c;为青岛乃至全国的软件产业转型升级注入了强劲…

【gmid】设计一个CS放大器

1.电路原理图 & 电路指标 设计指标&#xff1a; 负载电容CL2 pF增益带宽积GBW100 MHz增益 Av10gm/Id10 2. 根据电路指标进行 手算 2.1 确定 gm 2.2 确定负载电阻 RD 2.3 确定 Id Vov > 150mVgm/id < 10MOS管处于 强反型区Vov < 0gm/id 较大MOS管处于 亚阈值区0…

深入解析 Go 语言 GMP 模型:并发编程的核心机制

前言 本章是Go并发编程的起始篇章&#xff0c;在未来几篇文章中我们会围绕Go并发编程进行理论和实战的学习&#xff0c;欢迎关注我哦&#xff01; 本章主要以介绍GMP模型为主&#xff0c;偏向于面试和八股&#xff0c;目的是让小伙伴们注重于知识本身&#xff0c;面向面试&am…

昇思25天学习打卡营第20天|CV-ResNet50图像分类

打卡 目录 打卡 图像分类 ResNet网络介绍 数据集准备与加载 可视化部分数据集 残差网络构建 Building Block 结构 代码实现 Bottleneck结构 代码实现 构建ResNet50网络 代码定义 模型训练与评估 可视化模型预测 重点&#xff1a;通过网络层数加深&#xff0c;感知…

Windows系统使用Docker搭建Focalboard项目管理工具详细教程

目录 前言 1. 使用Docker本地部署Focalboard 1.1 在Windows中安装 Docker 1.2 使用Docker部署Focalboard 2. 安装Cpolar内网穿透工具 3. 实现公网访问Focalboard 4. 固定Focalboard公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给…