线段树例题题解
卫星覆盖(NOI1997)
题面:
SERCOI(Space-Earth Resource Cover-Observe lnstitute) 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以覆盖空间直角坐标系中一定大小的立方体空间,卫星处于该立方体的中心。 其中 (x,y,z)(x,y,z) 为立方体的中心点坐标, rr 为此中心点到立方体各个面的距离(即 rr 为立方体高的一半).立方体的各条边均平行于相应的坐标轴。我们可以用一个四元组 (x,y,z,r)(x,y,z,r) 描述一颗卫星的状态,它所能覆盖的空间体积 。 由于一颗卫星所能覆盖的空间体积是有限的,因此空间中可能有若干颗卫星协同工作。它们所覆盖的空间区域可能有重叠的地方,如下图所示(阴影部分表示重叠的区域)。

写一个程序,根据给定的卫星分布情况,计算它们所覆盖的总体积。
思路
第一道自己做的NOI的题。
说白了就是求三维立方体的覆盖体积。
我们继承我们二维的思想,也就是用扫描线和线段树来求矩形的面积并。
扩展到三维上,也就是我们把他分割成很多高度为一的层,然后对于每一个层去做二维的面积并。
然后答案就是每一个层的二维面积并的和。
时间复杂度:。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
struct owl{int x,y1,y2;int k;bool operator < (const owl & t)const{return x < t.x;}
}seg[N * 2];
struct hoot{int l,r;int cnt;int len;
}tr[N * 8];
vector<int>ys;
int find(int y){return lower_bound(ys.begin(), ys.end(), y) - ys.begin();
}
void pushup(int u){if (tr[u].cnt){tr[u].len = ys[tr[u].r + 1] - ys[tr[u].l];}else if (tr[u].l != tr[u].r){tr[u].len = tr[u << 1].len + tr[u << 1 | 1].len;}else{tr[u].len = 0;}
}
void build(int u,int l,int r){tr[u] = {l,r,0,0};if (l != r){int mid = l + r >> 1;build(u << 1,l,mid),build(u << 1 | 1,mid + 1,r);}
}
void modify(int u,int l,int r,int k){if (tr[u].l >= l && tr[u].r <= r){tr[u].cnt += k;pushup(u);}else{int mid = tr[u].l + tr[u].r >> 1;if (l <= mid){modify(u << 1,l,r,k);}if (r > mid){modify(u << 1 | 1,l,r,k);}pushup(u);}
}
struct DID{int x,y,z,d;
}v[N];
struct SOREN{int x1,y1,x2,y2;
};
int main(){cin >> n;for (int i = 1; i <= n; i ++ ){cin >> v[i].x >> v[i].y >> v[i].z >> v[i].d;}int ans = 0;for (int Z = -1000; Z <= 1000; Z ++ ){ys.clear();int m = 0;vector<SOREN>vec;for (int i = 1; i <= n; i ++ ){int x1 = -3000, y1 = -3000, x2 = -3000, y2 = -3000;if (Z >= v[i].z - v[i].d + 1 && Z <= v[i].z + v[i].d){x1 = v[i].x - v[i].d,x2 = v[i].x + v[i].d;y1 = v[i].y - v[i].d,y2 = v[i].y + v[i].d;}if (x1 == -3000 && y1 == -3000 && x2 == -3000 && y2 == -3000){continue;}seg[m ++ ] = {x1, y1, y2, 1};seg[m ++ ] = {x2, y1, y2, -1};vec.push_back({x1,y1,x2,y2});ys.push_back(y1), ys.push_back(y2);}if (vec.size() == 1){ans += (vec[0].x2 - vec[0].x1) * (vec[0].y2 - vec[0].y1);continue;}if (m > 0){sort(ys.begin(), ys.end());ys.erase(unique(ys.begin(), ys.end()), ys.end());build(1, 0, ys.size() - 2);sort(seg, seg + m);int res = 0;for (int i = 0; i < m; i ++ ){if (i > 0){res += (tr[1].len) * (seg[i].x - seg[i - 1].x);}modify(1, find(seg[i].y1), find(seg[i].y2) - 1, seg[i].k);}ans += res;}}cout << ans;return 0;
}
相关文章:
线段树例题题解
卫星覆盖(NOI1997) 题面: SERCOI(Space-Earth Resource Cover-Observe lnstitute) 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…...
AI提示词工程的“优化背后”:如何通过精准提示提升模型性能?
提示词工程(Prompt Engineering)已经成为推动AI模型如GPT等发挥其强大能力的核心。AI模型的输出质量与输入的提示词密切相关。因为之前已经大致用过一段时间提示词,所以这篇文章集中在有一定基础,起码对提示词不陌生,想要去设计和优化提示词+处理复杂问题的时候不知道如何…...
c# Record关键字
在 C# 9.0 中引入了 record 关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。 …...
高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程
前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI,用户可以轻松管理 Nginx 配置,而无需直接编辑配置文件,尤其适合新手用户和频繁修改配置的场景。 官网文档:nginxWebUI - 文档 本文将分享为什么选择 ngin…...
家政预约小程序04活动管理表结构设计
目录 1 创建活动表2 创建活动规则表3 创建活动参与记录表总结 为了满足我们日常的营销,我们通常需要搞一些活动,比如满减、折扣、团购等。启动活动后,会在首页进行显示,当用户访问小程序的时候,就可以参与活动…...
谷歌浏览器的在线存储功能使用方法
谷歌浏览器不仅是目前全球使用最广泛的网络浏览器之一,它还集成了许多实用的功能来提升用户体验。其中,谷歌浏览器的在线存储功能允许用户将数据保存在云端,实现跨设备的无缝同步和共享。本文将详细介绍如何在谷歌浏览器中使用这一功能。 一、…...
HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发
背景介绍 在当今数字化时代,各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控,还是智慧工厂、智慧城市等领域,都需要高效、智能的设备来保障安全和提高生产效率。然而,传统的视频监控设备存在诸多痛点:…...
回调机制实现观察者模式
观察者设计模式,允许对象在状态变化时通知其他依赖对象,通常通过回调函数实现。 在回调机制中,可以注册多个回调函数,以便在特定事件发生时依次调用它们。下面是一个示例,展示如何在 C 中实现一个简单的事件管理器&am…...
并发编程系列(一) -多线程技术快速入门
最近对 Java 并发编程技术知识进行了重新整理,再次献上文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 并发编程系列(一) -多线程技术快速入门并发编程系列(二) -Thread类介绍并发编程系列(三) -synchronized关键字介绍并发编程系列(四) -v…...
单元测试入门和mockup
Java 新手入门:Java单元测试利器,Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式,学一下单测思路 这个没有动态代理,所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...
蓝桥杯(Java)(ing)
Java前置知识 输入流: (在Java面向对象编程-CSDN博客里面有提过相关知识------IO流) // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…...
【Linux-多线程】线程互斥(锁和它的接口等)
一、线程互斥 我们把多个线程能够看到的资源叫做共享资源,我们对共享资源进行保护,就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题,下面是一个抢票的代码,共计票数10000张,4个线程去抢 之前我们展示过封…...
[江科大STM32] 第五集快速建立STM32工程模板——笔记
保存,进去选芯片型号,我们是F10C8T6 一个MD,还有所有.c.h 这里所有文件 这里所有文件...
流水线并行举例说明;GPU 的细粒度问题
GPU 的细粒度与模型并行和流水线并行关系 使用模型并行和流水线并行之后会涉及到一个模型切分细粒度的问题,先切分多头(并行执行),每一个多头在切分不同阶段(串行执行)。这种情况下GPU的细粒度是多少 在这种模型并行和流水线并行结合且按多头和阶段切分的情况下,GPU 的…...
如何确保Kafka集群的高可用?
大家好,我是锋哥。今天分享关于【如何确保Kafka集群的高可用?】面试题。希望对大家有帮助; 如何确保Kafka集群的高可用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 要确保 Kafka 集群 的高可用性,需要…...
计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Oracle SqlPlus常用命令简介
参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...
8.若依系统监控与定时任务
帮助开发者和运维快速了解应用程序的性能状态。 数据监控 定时任务 实现动态管理任务。 需求:每间隔5s,控制台输出系统时间。 新建的任务类必须在指定目录ruoyi-quartz模块下的task包下。 状态设置为启动 执行策略 场景:比如一个任务每个…...
《计算机组成及汇编语言原理》阅读笔记:p160-p176
《计算机组成及汇编语言原理》学习第 12 天,p160-p176 总结,总计 17 页。 一、技术总结 1.PowerPC (1)programming model(mode) As in most modern computers, there are at least two separate views of the system (formally called programming m…...
TCP网络编程(三)—— 客户端的编写/服务器端和客户端的通信
上篇文章我们学习了TCP的服务器端模式的编写,这篇文章我们将开始编写客户端的代码,完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同,在客户端我们只需要服务器端的套接字和服务器端的地址和端口,用于向…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
