P2163 [SHOI2007] 园丁的烦恼 题解

题目传送门

题目大意:

在一个平面直角坐标系上,给定 \(n\) 个点的坐标 \((x,y)\)\(m\) 次询问,每次询问一个矩形范围内的点的数量,此矩形用 \(\{a, b, c, d\}\) 来描述,其中 \((a, b)\) 为左下角,\((c, d)\) 为右上角。

思路:

不难将题目转化为:给定一个长度为 \(n\) 的序列,序列中的每个元素都有两个属性 \(x,y\),每次询问求 \(x\in [a, c]\)\(y\in [b, d]\) 的元素个数。

和 这道题 差不多的思路,都用类似前缀和的思想,但这道题是二维前缀和。

对于一个询问,我们要处理的其实是这样一个图形:

其中四边形 \(\text{AGBH}\) 是我们要求的。

设此询问为 \(\{x1, y1, x2, y2\}\)
\(A(x1 - 1, y1 - 1)\)
\(E(x1 - 1, y2)\)
\(G(x2, y1 - 1)\)
\(B(x2, y2)\)

设左下角为 \((0, 0)\),右上角为 \((i, j)\) 的矩形中点的数量为 \(sum_{i, j}\)

所以我们要求的是 \(sum_{x2, y2} + sum_{x1 - 1, y1 - 1} - sum_{x1 - 1, y2} - sum_{x2, y1 - 1}\)

将询问分成四个部分,分别存 \(A,E,G,B\) 四个,然后将给定的点和询问都按照 \(x\) 升序排列,这样 \(x\) 的限制就可以不用管了,再建立一个树状数组来维护 \(y\) 即可。

需要注意的几个点:

  1. 本题值域较大,需要离散化;(其实也没有那么大,不离散化也能过)
  2. 离散化后的数要从 \(1\) 开始,因为为 \(0\) 的话树状数组会死循环;
  3. 询问要分成 \(4\) 份,也就是说要开 \(4\) 倍空间,同理,树状数组的值域也要开大点。

\(\texttt{Code:}\)

#include <vector>
#include <iostream>
#include <algorithm>#define lowbit(x) x & -x
using namespace std;const int N = 500010, M = 20000010;int n, m;
struct BIT{int c[M];void add(int x, int y) {for(; x < M; x += lowbit(x)) c[x] += y;}int ask(int x) {int res = 0;for(; x; x -= lowbit(x)) res += c[x];return res; }
}tr;
vector<int> nums;
struct node{int id, x, y, sign;bool operator< (const node &o) const {return x < o.x;}
}q[N << 2];
int tt;
struct Point{int x, y;bool operator< (const Point &o) const {return x < o.x;}
}a[N];
int ans[N];int find(int x) {return lower_bound(nums.begin(), nums.end(), x) - nums.begin() + 1;
}int main() {scanf("%d%d", &n, &m);int x, y;for(int i = 1; i <= n; i++) {scanf("%d%d", &x, &y);a[i] = {x, y};nums.push_back(y);}int x1, y1, x2, y2;for(int i = 1; i <= m; i++) {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);q[++tt] = {i, x1 - 1, y1 - 1, 1};q[++tt] = {i, x1 - 1, y2, -1};q[++tt] = {i, x2, y1 - 1, -1};q[++tt] = {i, x2, y2, 1};nums.push_back(y1 - 1), nums.push_back(y2);}sort(nums.begin(), nums.end());nums.erase(unique(nums.begin(), nums.end()), nums.end());sort(a + 1, a + n + 1);sort(q + 1, q + tt + 1);int id = 1;for(int i = 1; i <= tt; i++) {while(a[id].x <= q[i].x && id <= n) tr.add(find(a[id++].y), 1);ans[q[i].id] += q[i].sign * tr.ask(find(q[i].y));}for(int i = 1; i <= m; i++)printf("%d\n", ans[i]);return 0;
}

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

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

相关文章

金牌AI销售机器人,轻松直翻业绩!

本文由 ChatMoney团队出品老板们,你们现在的压力是不是越来越大了?员工和往年是一样的,但是业绩却比往年差一半! 尤其是电商行业,是“优化”员工还是广招人才?人工成本都很高。还得把业绩拉上去?怎么办呢? 目前我们采用Chatmoney全能知识库AI销售系统,用人工智能来实现…

S32G3任务抢占

通过S32G3 的STM定时器 实现任务任务抢占 1、创建一个空工程 2、创建完成后先生成一版代码 3、编译 4、添加user文件夹来存放自己的代码my_os.h/*********************************************************************************************************************/ /…

我们的网站被狗爬了!

大家好,我是程序员鱼皮。 世风日下,人心不古。我们的程序员面试刷题网站 《面试鸭》 才刚刚上线了一个多月,就由于过于火爆,被不少同行和小人发起网络攻击。 而且因为我们已经有 4500 多道人工整理的企业高频面试题、100 多个各方向的面试题库、大厂面试官原创的优质题解,…

Nmap 7.95 - Zenmap 汉化版,端口扫描、网络嗅探工具

Nmap 7.95 - Zenmap 汉化版 本来想找一个端口扫描工具,先找到了 Angry IP Scanner 用了一下,有时候扫不到,功能也比较单一。最后找到了 Nmap,这个功能要强大很多。网上没有最新的汉化版本,老版本的汉化还存在BUG,于是自己动手汉化了一下。功能介绍:Nmap是一款功能强大的…

TapData 信创数据源 | 国产信创数据库 TiDB 数据迁移指南,加速国产化进程,推进自主创新建设

本专题将以 TapData 正在支持的各国产信创数据源为原点,提供详细的数据库同步、迁移教程,为有需求的用户提供更灵活的工具选择。本文将介绍的 TapData 数据源为——TiDB。随着国家对自主可控的日益重视,目前在各个行业和区域中面临越来越多的国产化,采用有自主知识产权的国…

基于 LLM 制作了一个 SQL 方言转换器,未来的某天我可能会用上

事件起因,公司有从sqlserver转mysql的打算,源码里有不少sqlserver的语句,没有啥批量修改的好方法,人力解决最稳妥,所以基于大模型制作了一个方言转换器项目基于.NET6 MVC + Bootstrap 简单页面就没有去build前端了,jquery字符串拼接一把梭 项目已开源:https://github.co…

oracle产品周期

JDBC 下载链接:https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html

计算机入门和服务器入门知识总结

一、计算机入门知识 1.1 什么是计算机 是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速地处理,然后把处理结果输出的现代化智能电子设备发明计算机的目标是代替人类去高效且高质量地完成工作。 1.2 计算机发展史第一代计算机(1946-1957) 电子管时代…

会议海报/论文海报编辑流程

模板网站 https://www.posterpresentations.com/free-poster-templates.html 选择感兴趣的模板,下载对应的尺寸比如下载第一个,想要改变颜色设计的话,在ppt中最上面点击“设计-变体更多-颜色”,可以整体更改模板颜色 如果想要修改模板背景色之类的,比如改成白色,点击“视…

汽车测试及质量监控博览会(中国)——北汇信息邀请函

尊敬的先生/女士: 北汇信息将于 8.28-30 号参加汽车测试及质量监控博览会,展位号:7028,诚邀您莅临展位进行参观交流!汽车测试及质量监控博览会(中国)2024汽车测试及质量监控博览会(中国)(Testing Expo China – Automotive)是引领世界的国际博览会,展示汽车测试、开发…

golang对遍历目录操作的优化

一转眼go1.23都快发布了,时间过得真快。 不过今天我们把时间倒流回三年半之前,来关注一个在go1.16引入的关于处理目录时的优化。 对于go1.16的新变化,大家印象最深的可能是io包的大规模重构,但这个重构实际上还引进了一个优化,这篇文章要说的就是这个优化。 本文默认Linux…

老旧 Linux 系统搭建现代 C++ 开发环境 —— 基于 neovim

一台 CentOS7 老机器,能不能打造基于 vim 的现代化 IDE?本文以实操为主,带你一步步搭建自己的环境问题背景 公司配发的电脑是 macOS,日常开发需要访问 Linux 虚拟机,出于安全方面的考虑,只能通过跳板机登录。这阻止了大多数远程图形界面的使用,让写代码的工作变得复杂起…