二维数点问题

news/2025/1/24 12:44:19/文章来源:https://www.cnblogs.com/sadlin/p/18689376

P10814 【模板】离线二维数点

询问区间 \([l,r]\) 内,在值域为 \([0,x]\) 中数的个数。
想象这是个二维平面,我们要求的就是矩形内点的个数。

image

通常用 cdq 做,将询问拆成两个点,将点按照x坐标排序,按照y坐标加入到树状数组中(为了满足第二条限制),这时就依次加入点,并用树状数组进行前缀和相减,用两个前缀求区间信息,并且两个前缀都是在满足限制的情况下计算的。

P2163 [SHOI2007] 园丁的烦恼

同样二维数点题目,不过查询区间改为了矩形,我们同样用二维前缀和的做法,容斥掉多余的部分。

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define int ll
#define ls p<<1
#define rs p<<1|1 
#define re register 
#define pb push_back
#define pir pair<int,int>
#define f(a,x,i) for(int i=a;i<=x;i++)
#define fr(a,x,i) for(int i=a;i>=x;i--)
#define lb(x) x&(-x); 
using namespace std;
const int N=5e5+10;
const int B=1e6+5;
const int M=8e6+10;
const int mod=1e9+7;int n,m;struct ss{int x,y,id,op,w;
}a[M];//点坐标struct sss{int x,y,z,h;
}q[N];int ans[N];//答案int cnt=1;int b[M],tot=0;//离散化
int len=0;int xx[N],yy[N];bool cmp(ss g,ss h){if(g.x!=h.x) return g.x<h.x;if(g.y!=h.y) return g.y<h.y;return g.w>h.w;
}int t[N+10];
void add(int x,int k){while(x<=len+10){t[x]+=k,x+=lb(x);}
}
int query(int x){int sum=0;while(x){sum+=t[x],x-=lb(x);}return sum;
}	
void solve(){// freopen("a.in","r",stdin);// freopen("a.out","w",stdout);  cin>>n>>m;for(int i=1;i<=n;i++){int x,y;cin>>x>>y;xx[i]=x;yy[i]=y;b[++tot]=x;b[++tot]=y;}for(int i=1;i<=m;i++){int x,y,z,h;cin>>x>>y>>z>>h;q[i]={x,y,z,h};b[++tot]=x;b[++tot]=y;b[++tot]=z;b[++tot]=h;}sort(b+1,b+1+tot);len=unique(b+1,b+1+tot)-b-1;for(int i=1;i<=n;i++){int x,y;x=lower_bound(b+1,b+1+len,xx[i])-b+2;y=lower_bound(b+1,b+1+len,yy[i])-b+2;a[cnt++]={x,y,0,1,1};}for(int i=1;i<=m;i++){int x,y,z,h;x=lower_bound(b+1,b+1+len,q[i].x)-b+2;y=lower_bound(b+1,b+1+len,q[i].y)-b+2;z=lower_bound(b+1,b+1+len,q[i].z)-b+2;h=lower_bound(b+1,b+1+len,q[i].h)-b+2;a[cnt++]={x-1,y-1,i,1,0};a[cnt++]={x-1,h,i,-1,0};a[cnt++]={z,y-1,i,-1,0};a[cnt++]={z,h,i,1,0};}cnt--;sort(a+1,a+cnt+1,cmp);for(int i=1;i<=cnt;i++){add(a[i].y,a[i].w);if(a[i].w==0){int sum=a[i].op*query(a[i].y);ans[a[i].id]+=sum;	}}for(int i=1;i<=m;i++){cout<<ans[i]<<"\n";}
}
signed main(){ios::sync_with_stdio(0);cin.tie(nullptr);int t=1;// cin>>t;while(t--){solve();}return 0;
}

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

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

相关文章

CS162 23Fall总结

CS 162 23Fall Lab 总结 PintOS是一个x86架构的教育用操作系统,它支持多线程,加载并运行用户程序,以及文件系统。骨架代码只提供了很简单的实现,本Lab需要丰富并增强这些模块的功能。本实验提供Bochs2和QEMU3模拟器模拟x86 CPU和相应外设来运行并调试PintOS.PintOS源码结构…

《汇编语言》阅读笔记

如题汇编语言 首先,我必须赞扬王爽老师,这是我见过写的最好的教科书了. 然后要注意,汇编语言这本书的前提是8086PC机十六位处理器.还要学x86和x64以及其他奇奇怪怪的架构的汇编 全称 AH&AL=AX(accumulator):累加寄存器 BH&BL=BX(base):基址寄存器 CH&CL=CX(co…

【unity】学习制作2D横板冒险游戏-3-

添加野猪添加刚体2D组件,碰撞组件,该碰撞组件是确保野猪能跟地面碰撞添加玩家图层和敌人图层,并应用,使野猪和玩家不会彼此被推着走碰撞剔除中选择Player和Enemy再增加一个碰撞组件当作触发器,设置如下,该碰撞组件是确保人物和怪物的互动基本属性及其计算 再如图路径下创建…

远控流畅游戏,我用过最棒工具ToDesk

孤独乏味人又懒,能够干嘛来消遣?手游、端游都好玩,没有高端设备在身边,也是能够轻松玩!究竟怎么实现的?其实就是通过ToDesk这种专业的远程控制软件来随时随地操作异地的目标设备从而帮助实现更丝滑给力的远程游戏畅玩体验!当然,用户能够借助完成这需求的辅助工具并不止…

C# Odbc Informix读取中文方法

一。 部署好informix服务器后 二。 在windows主机安装好Informix Client-SDK, 这个软件客户端时免费的,可以在官网下载 三。配置好ODBC连接 1.用户名密码服务端口自行填写 2.关于客户语言的配置要使用以下参数: Client Locale -> en_US.CP1252 Database Locale -> en_…

ToDesk远程连接几项模式区别何在?

对于很多用过ToDesk远程控制软件进行随时随地跨系统、跨设备操作的小伙伴们来说,它无疑能解决做种场景下问题,无论是在职场工作中,还是日常生活中,均能带来很多便捷!虽然轻松使用很简单,但很多所不知道的是其实应对不同的情况,选择不同的连接模式更有益!以下木木小编就…

如何在网站后台修改首页?

修改网站后台首页通常涉及对后台管理界面的调整。以下是详细步骤:登录后台:使用管理员账号登录网站后台管理系统。 进入模板管理:在后台管理系统中找到“模板管理”或“模板文件管理”选项。 编辑模板文件:找到后台首页的模板文件(如index.htm或index.php),使用代码编辑…

一些关于软件测试中登录模块的测试用例

以下是一份针对软件测试中登录模块较为完整的测试用例,涵盖了各种常见情况,尽量保证较高的覆盖率:一、功能测试1. 正常登录 2. 用户名错误 3. 密码错误 4. 用户名和密码都错误 5. 用户名和密码为空 6. 仅用户名为空 7. 仅密码为空 8. 用户名和密码长度极限值 9. 记住用户名…

如何修改网站管理员admin的信息?

登录网站后台:使用管理员账号(通常是admin)登录到网站的后台管理界面。进入用户管理页面:在后台管理界面中,找到“用户”、“用户管理”或类似的菜单选项,点击进入用户管理页面。找到管理员账号:在用户管理页面中,找到管理员账号(通常是admin),点击账号名称或编辑按…

如何在网站上修改源代码?

要在网站上修改源代码,您可以按照以下步骤进行操作:确定要修改的代码:确定您想要修改的网站源代码文件。 找到代码文件:根据您的网站结构,找到包含要修改代码的文件。 编辑代码文件:使用文本编辑器或专业的网页设计工具,编辑代码文件中的代码。 保存修改:修改完成后,保…

如何在CMS系统中动态修改网站栏目?

在CMS系统中动态修改网站栏目通常涉及后台管理界面的操作。以下是详细步骤:登录后台:使用管理员账号登录CMS后台管理系统。 进入栏目管理:在后台管理系统中找到“栏目管理”或“频道管理”选项。 编辑栏目:选择需要修改的栏目,进行编辑。可以更新栏目名称、描述、排序等信…

补充篇:Unity中Compute Shader的基本使用

补充篇:Unity中Compute Shader的基本使用 Compute Shader 可以充分利用GPU来帮助我们处理大规模的并行任务。虽然名字带Shader,但它可不光用于图形学,所以即便对渲染相关的知识不甚了解,也不妨碍学习它的用法。 基本流程 对任意 Project的文件夹右键Create/Shader/Compute …