P1502 窗口的星星 题解

news/2024/11/15 6:56:01/文章来源:https://www.cnblogs.com/FRZ29/p/18353478

题目传送门。

思路

扫描线

扫描线

首先,将题目中给出的条件和问题进行转化:

首先先不考虑边框上的点不算在内的限制,考虑一个点可以对那些矩形产生贡献。

只考虑矩形的右上角,容易发现,每个星星的亮度只对右上角在以星星为左下角的长为 \(W\),高为 \(H\)的矩形有贡献。
如图。

那么便可以把问题进行转化:在平面直角坐标系上有 \(n\) 个有权值矩形,求他们最大的重合的权值。

于是就可以用扫描线来解决了。

再考虑边框上的点不算在内的限制,因为可以这样框:

有效的矩形就相当于 \(W - 1\)\(H - 1\) 的能取边框上的点的矩形,然后像上面那样做就可以了。

细节

对线进行排序时,要注意若两条线重合,应按权值从大到小排序。
因为可能两个矩形贴合,而又能取矩形边框上的点,所以不排序的话权值可能算小。

点击查看代码

代码

/*--------------------------------|        code by FRZ_29        ||          code  time          ||          2024/08/11          ||           11:02:16           ||             星期天            |--------------------------------*/#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
typedef long long LL;using namespace std;void RD() {}
template<typename T, typename... U> void RD(T &x, U&... arg) {x = 0; LL f = 1;char ch = getchar();while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();x *= f; RD(arg...);
}const LL N = 1e4 + 5;#define LS (rt << 1)
#define RS (rt << 1 | 1)
#define MID (l + r >> 1)
#define LF(i, __l, __r) for (LL i = __l; i <= __r; i++)
#define RF(i, __r, __l) for (LL i = __r; i >= __l; i--)struct tree{LL l, r, mx, add;tree(LL l = 0, LL r = 0, LL mx = 0, LL add = 0) : l(l), r(r), mx(mx), add(add) {}
} tr[N << 4];
struct seg {LL l, r, h, val;seg(LL l = 0, LL r = 0, LL h = 0, LL val = 0) : l(l), r(r), h(h), val(val) {}
} a[N << 1];
LL t, n, w, h, Y[N << 1];void up(LL rt) { tr[rt].mx = max(tr[LS].mx, tr[RS].mx); }
bool cmp(seg a, seg b) { return (a.h != b.h ? a.h < b.h : a.val > b.val); }void Init() {memset(a, 0, sizeof(a));memset(tr, 0, sizeof(tr));
}void build(LL rt, LL l, LL r) {tr[rt] = tree(l, r, 0LL, 0LL);if (l == r) return;build(LS, l, MID), build(RS, MID + 1, r);
}void down(LL rt) {tr[LS].mx += tr[rt].add;tr[RS].mx += tr[rt].add;tr[LS].add += tr[rt].add;tr[RS].add += tr[rt].add;tr[rt].add = 0;
}void update(LL rt, LL L, LL R, LL val) {LL l = tr[rt].l, r = tr[rt].r;if (L <= l && r <= R) {tr[rt].mx += val;tr[rt].add += val;return;}down(rt);if (L <= MID) update(LS, L, R, val);if (R > MID) update(RS, L, R, val);up(rt);
}int main() {RD(t);while (t--) {Init();RD(n, w, h);w--, h--;LF(i, 1, n) {LL x, y, l;RD(x, y, l);Y[2 * i - 1] = y, Y[2 * i] = y + h;a[2 * i - 1] = seg(y, y + h, x, l);a[2 * i] = seg(y, y + h, x + w, -l);}n <<= 1;sort(Y + 1, Y + n + 1);LL len = unique(Y + 1, Y + n + 1) - Y - 1;sort(a + 1, a + n + 1, cmp);LF(i, 1, n) {LL low_l = lower_bound(Y + 1, Y + len + 1, a[i].l) - Y;LL low_r = lower_bound(Y + 1, Y + len + 1, a[i].r) - Y;a[i].l = low_l, a[i].r = low_r;}build(1, 1, len);LL ans = 0;LF(i, 1, n) {update(1, a[i].l, a[i].r, a[i].val);ans = max(ans, tr[1].mx);}printf("%lld\n", ans);}return 0;
}/* * ps:FRZ弱爆了 * 感冒写的代码唐爆了……*/

前尘隔海,古屋不再。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bugbountyhunter scope BARKER:第7滴血 存储型 XSS 编码测试和多处引用 报告

注册后,来到UI Display Name处直接点击更新之后,发现反射值的存在尝试一些编码,发现没有任何转换。编码测试更简单,语义一把梭:比如各种华丽花哨的编码到落地并没有被还原成 <>"等语义,此处没有漏洞 https://github.com/swisskyrepo/PayloadsAllTheThings/tre…

centos7中安装了centos-release-scl后,之前的yum源变为不可用 解决方案

centos7中安装了centos-release-scl后,之前的yum源变为不可用 解决方案 1. 前言 今天遇到了一个奇奇怪怪的事情,我自己在自己的服务器(centos7)上安装了centos-release-scl后,之前运行正常的yum命令竟然变得不可用。 2. 场景重现 执行下面这条命令后,再次使用yum报错。 yum …

grpc-gateway:grpc转换为http协议对外提供服务

使用grpc的优点很多,二进制的数据可以加快传输速度,基于http2的多路复用可以减少服务之间的连接次数,和函数一样的调用方式也有效的提升了开发效率。 不过使用grpc也会面临一个问题,我们的微服务对外一定是要提供Restful接口的,如果内部调用使用grpc,在某些情况下要同时提…

PostgreSQL的查询详解

PostgreSQL的查询详解 1. 表表达式 表表达式计算一个表。该表表达式包含一个 FROM 子句,该子句后面可以根据需要选用 WHERE、GROUP BY 和 HAVING 子句。最简单的表表达式只是引用磁盘上的一个表,一个所谓的基本表,但是我们可以用更复杂的表表达式以多种方法修改或组合基本表…

zabbix采集器

zabbix采集器 环境介绍: 本例中安装zabbix开源软件和postgres,软件版本信息如下:软件 版本zabbix Zabbix6.4.0postgres 14.7zabbix-agent 6.4.17主机信息如下: Red Hat Enterprise Linux Server 7.9 (Maipo)主机名 主机地址 用途zib_server 192.168.101.238 zabbix的服务器…

Mermaid 赋能 VuePress:轻松绘制流程图、时序图,让博客内容更生动

聊聊如何让博客框架 VuePress 显示图表聊聊如何让博客框架 VuePress 显示图表 ‍ 什么是 mermaid 如果你还不了解,可以先看看我的 Markdown 教程——使用 Markdown 画图。 ‍ ‍ ‍ ‍ 安装依赖 相关插件有很多,我这里选择的是 vuepress-plugin-mermaidjs: ‍ npm i vuepres…

240704-物理存储结构

1. 物理存储结构 ​ Postgresql数据库目前不支持裸设备和块设备,在Postgresql数据库中表的数据时存放在一个或者多个物理的数据文件中。而相应的数据文件又分多个固定大小的数据块,数据就放在数据块中。 1.Postgresql数据库中术语 ​ Postgresql数据库与其他数据库不同,对于…

实模式、保护模式和长模式

个人一直对硬件、操作系统等底层技术感兴趣,无奈x86架构实在过于复杂,虽然国内外很多计算机通识教育已经将主要平台迁移至更简单的risc-v,但不可否认,很多优秀的参考资料依旧是基于x86的。当你打开这些资料,一大堆眼花缭乱的新名词直接砸到你脑袋上,什么实模式、保护模式…

Datawhale X 魔搭 2024年AI夏令营第四期AIGC方向 Task01

从零入门AI生图原理&实践是 Datawhale 2024 年 AI 夏令营第四期的学习活动(“AIGC”方向),基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展的实践学习——适合想 入门并实践 AIGC文生图、工作流搭建、LoRA微调 的学习者参与学习内容提要:从通过代码实现AI文生图逐渐…

搭建PostgreSQL高可用集群(基于Patroni+Etcd)

搭建PostgreSQL高可用集群(基于Patroni+Etcd) 1.主机环境准备节点名称 主机名 网卡 IP地址 OS 安装软件 角色作用PGSQL1 pgsql1 ens33 192.168.198.162 CentOS7 PostgreSQL、ETCD、Patroni 主数据库PGSQL2 pgsql2 ens33 192.168.198.163 CentOS7 PostgreSQL、ETCD、Patroni 备…

Pytorch入门:tensor张量的构建

tensor数据结构是pytorch的基础与核心,本文主要介绍三种常用的tensor张量的构建方式。 1.从已有其他数据转换为tensor数据 常用方法有如下两种:torch.tensor torch.Tensor上述两种方法有细微的差别,具体通过示例来进行展示运行结果为首先,torch.tensor会对转换前容器内元素的…

Centos7安装Java8

1.查看目前环境 rpm -qa|grep jdk原有系统安装有jdk,如果对于jdk有要求,我们就需要重新安装jdk 2.卸载原有jdk环境 rpm -e --nodeps 上面显示的东西这里,我们就需要一个一个去卸载 如果有感觉麻烦,可以使用如下命令 yum remove *openjdk* 3.重新检查java -versionrpm -qa|g…