P2163 [SHOI2007]园丁的烦恼(二维数点模板题)

P2163 [SHOI2007]园丁的烦恼

题意:

在一个二维平面内有一些点,给你一个左上角和右下角的点,问这个范围内有多少点

题解:

二维数点模板题
我们设F(a,b)表示以(0,0)为左下角,(a,b)为右上角的矩阵内有多少点
如图不难得到:
黑色部分为=F(c,d)+F(a-1,b-1)-F(a-1,d)-F(c,b-1)
(不就是二维前缀和)
在这里插入图片描述
因为数据范围过大,所以横纵坐标都离散化处理。
现在我们如何求(0,0)到(x,y)内点的数量
我们把矩阵内的点看作是插入操作,相当于在矩阵中(x,y)位置+1.
把所有插入操作和查询操作以x坐标为第一关键字,y坐标为第二关键字排序
若第i个是查询操作,仅有[1,i-1]中的插入操作能影响它,因为第i个操作后面的操作坐标都比它大
同样第i个操作是插入操作,不会影响到前面的查询
这样就利用树状数组实现二维数点问题
CDQ也可以二维数点,也是模板题

主席树也可以二维数点,这里有详细讲解

代码:

树状数组代码:

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<vector>
#define re register int
#define rl register ll
#define lowbit(x) x&(-x)
using namespace std;
typedef long long ll;
int read() {re x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-')	f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=10*x+ch-'0';ch=getchar();}return x*f;
}
inline void write(int x) {if(x>9)	write(x/10);putchar(x%10+'0');
}
inline char GetChar() {char ch=getchar();while(ch!='A' && ch!='B' && ch!='C')	ch=getchar();return ch;
}const int Size=500005;
int n,m,tot,maxn,ny[Size*5];
struct zyd {int id,x,y,k,dt;
} Q[Size*5];
inline void Push(int x,int y,int k,int id) {Q[++tot].x=x;Q[tot].y=y;Q[tot].k=k;Q[tot].id=id;Q[tot].dt=tot;
}
inline bool comp(zyd jzm,zyd xjp) {if(jzm.x!=xjp.x)	return jzm.x<xjp.x;if(jzm.y!=xjp.y)	return jzm.y<xjp.y;return jzm.dt<xjp.dt;
}
int tree[Size];
inline void update(int x) {for(re i=x; i<=maxn; i+=lowbit(i)) {tree[i]++;}
}
inline int query(int x) {int ans=0;for(re i=x; i; i-=lowbit(i)) {ans+=tree[i];}return ans;
}
int out[Size];
void solve() {n=read();m=read();for(re i=1; i<=n; i++) {int x=read();int y=read();Push(x,y,0,0);}for(re i=1; i<=m; i++) {int a=read();int b=read();int c=read();int d=read();Push(c,d,1,i);Push(a-1,b-1,1,i);Push(a-1,d,-1,i);Push(c,b-1,-1,i);}sort(Q+1,Q+1+tot,comp);for(re i=1; i<=tot; i++) {ny[i]=Q[i].y;}sort(ny+1,ny+1+tot);maxn=unique(ny+1,ny+1+tot)-(ny+1);for(re i=1; i<=tot; i++) {Q[i].y=lower_bound(ny+1,ny+1+maxn,Q[i].y)-ny;}for(re i=1; i<=tot; i++) {if(!Q[i].k) {update(Q[i].y);} else if(Q[i].k==1) {out[Q[i].id]+=query(Q[i].y);} else {out[Q[i].id]-=query(Q[i].y);}}for(re i=1; i<=m; i++) {printf("%d\n",out[i]);}
}int main() {solve();return 0;
}

CDQ代码:

#include<bits/stdc++.h>
#define maxn 5000005 * 5
using namespace std;
inline int read()
{char x = getchar();int lin = 0, f = 1;while(x < '0' || x > '9'){if(x == '-') f = -1;x = getchar();}while(x >= '0' && x <= '9'){lin = lin * 10 + x - '0';x = getchar();}return lin * f;
}
struct st{int x,y,typ,add,id,ans;
}s[maxn],ce[maxn];
int n,m,x,y,tot,a,b,c,d,ans[maxn];
void add(int x,int y,int typ,int add,int id,int ans)
{s[++tot] = (st) {x,y,typ,add,id,ans};
}
bool com(st a,st b)
{if(a.x == b.x)if(a.y == b.y)return a.typ < b.typ;else return a.y < b.y;return a.x < b.x;
}
void cdq(int l,int r)
{if(l == r) return;int mid = l + r >> 1;cdq(l,mid);cdq(mid + 1,r);int le = l,re = mid + 1,pos = 0,ans = 0;while(le <= mid || re <= r){if(re > r || (le <= mid && s[le].y <= s[re].y)){if(s[le].typ == 1) ++ans;ce[++pos] = s[le++];}else{if(s[re].typ == 2) s[re].ans += ans;ce[++pos] = s[re++];}}for(int i = 1; i <= pos; i++)s[l + i - 1] = ce[i];
}int main(){n = read(); m = read();for(int i = 1; i <= n; i++){x = read(); y = read();add(x,y,1,0,0,0);}for(int i = 1; i <= m; i++){a = read(); b = read();c = read(); d = read();add(a - 1,b - 1,2,1,i,0);add(c,d,2,1,i,0);add(a - 1,d,2,-1,i,0);add(c,b - 1,2,-1,i,0);}sort(s + 1,s + 1 + tot,com);cdq(1,tot);for(int i = 1; i <= tot; i++)if(s[i].typ == 2)ans[s[i].id] += s[i].add * s[i].ans;for(int i = 1; i <= m; i++)printf("%d\n",ans[i]);
}

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

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

相关文章

Orleans MultiClient 多个Silo复合客户端

介绍Orleans.MultiClient 是一个 Orleans 复合客户端&#xff0c;只需要简单配置就可以简单高效连接和请求 Orleans 服务。Orleans.MultiClient 可以轻松连接多个不同服务的 Orleans 服务,在请求 Orleans 时会根据请求的接口自动寻找 Orleans 客户端&#xff0c;使用者无需关心…

ASP.NET Core 进程内(InProcess)托管(6)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 中的 Main方法ASP.NET Core 进程内(InProcess)托管在这个视频中我们将讨论在ASP.NET Core中的进程内(InProcess)托管模型什么是Kestrel服务器当一个 ASP.NET Core 应用程序执行的时候&#xff0c;.NET…

约会安排 HDU - 4553

约会安排 HDU - 4553 题意&#xff1a; 题意又丑又长就不叙述了 题解&#xff1a; 这个题一开始理解错了。。。题目相当于是有三种情况占据时间&#xff0c;分别是学习&#xff0c;女神和屌丝&#xff0c;我们用不同的lazy来表示女神和屌丝&#xff0c;根据优先级去更新状态…

ML.NET机器学习、API容器化与Azure DevOps实践(一):简介

打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用&#xff0c;包括一些常用的业务场景、算法的选择、模型的训练以及RESTful API的创建、机器学习服务容器化&#xff0c;以及基于Azure DevOps的容器化部署等等相关的内容。如果你从来没有玩过机器学习&#xff0c…

Picture POJ - 1177(矩形周长并))

Picture POJ - 1177 题目&#xff1a; 多个矩阵相交在一起&#xff0c;问新图形的周长是多少 题解&#xff1a; 参考题解 周长分为两部分&#xff1a;横线和竖线 横线计算方法&#xff1a;现在总区间被覆盖的长度和上一次总区间被覆盖的长度之差的绝对值 那么我们只需要从…

聊一聊C# 8.0中的await foreach

很开心今天能与大家一起聊聊C# 8.0中的新特性-Async Streams,一般人通常看到这个词表情是这样.简单说,其实就是C# 8.0中支持await foreach.或者说,C# 8.0中支持异步返回枚举类型async Task<IEnumerable<T>>.好吧,还不懂?Good,这篇文章就是为你写的,看完这篇文章,你…

ASP.NET Core 实现带认证功能的Web代理服务器

引言最近在公司开发了一个项目&#xff0c;项目部署架构图如下&#xff1a;思路如图中文本所述&#xff0c;公司大数据集群不允许直接访问外网&#xff0c;需要一个网关服务器代理请求&#xff0c;本处服务器A就是边缘代理服务器的作用。通常技术人员最快捷的思路是在服务器A上…

Unfair contest(个人做法)

Unfair contest 题意&#xff1a; 两个人参赛&#xff0c;n个评委打分&#xff0c;去掉s个最高分&#xff0c;去掉t个最低分&#xff0c;剩下分求平均分&#xff0c;平均分大的获胜。你是第n个评委&#xff0c;此时已知前n-1个评委所打分数&#xff0c;现在轮到你打分&#x…

ASP.NET Core 进程外(out-of-process)托管(7)《从零开始学ASP.NET CORE MVC》

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 进程内(InProcess)托管ASP.NET Core 进程内(InProcess)托管我们先简单回顾下 ASP.NET Core 中,要配置InProcess的服务器&#xff0c;需要在项目文件中添加< AspNetCoreHostingModel >元素&#…

eShopOnContainers 知多少[10]:部署到 K8S | AKS

1. 引言断断续续&#xff0c;感觉这个系列又要半途而废了。趁着假期&#xff0c;赶紧再更一篇&#xff0c;介绍下如何将eShopOnContainers部署到K8S上&#xff0c;进而实现大家常说的微服务上云。2. 先了解下 Helm读过我上篇文章ASP.NET Core 借助 K8S 玩转容器编排的同学&…

DI是实现面向切面和面向抽象的前提

DI越来越重要DI就是依赖注入&#xff0c;现在来说&#xff0c;大部分框架都是以DI为基础组件的&#xff0c;每一个框架都有自己的DI组件&#xff0c;像dotnet core&#xff0c;java spring等&#xff0c;也都为自己的框架量身打造了DI工具。面向对象的几个原则依赖倒置原则&…

.net core 并发下的线程安全问题

抱歉&#xff0c;其实内容并不如题&#xff01;&#xff01;&#xff01;背景&#xff08;写测试demo所出现的异常&#xff0c;供大家学习与拍砖&#xff09;&#xff1a;.net core webapi项目&#xff0c;做了一个授权的filter&#xff08;真正的生产项目的话&#xff0c;JWT很…

cf1555B. Two Tables

cf1555B. Two Tables 题意&#xff1a; 一个大矩阵空间内放置一个矩阵a&#xff0c;现在要再往这个空间内放一个矩阵b&#xff0c;a移动距离len才能放下b&#xff0c;问len最小是多少 题解&#xff1a; 不难发现左右或上下移动是最佳的&#xff0c;斜着移动是最不好的。此时…

cf1555C Coin Rows

cf1555C Coin Rows 题意&#xff1a; 有一个两行m列的地图&#xff0c;每个格子都有对应的价值&#xff0c;有a&#xff0c;b两个人&#xff0c;都从左上角到右下角&#xff0c;且都只能向右向下走&#xff0c;a先出发&#xff0c;a每到一个格子&#xff0c;就会获得这个地方…

C#并行编程(2):.NET线程池

线程 Thread在总结线程池之前&#xff0c;先来看一下.NET线程。.NET线程与操作系统(Windows)线程有什么区别&#xff1f;.NET利用Windows的线程处理功能。在C#程序编写中&#xff0c;我们首先会新建一个线程对象System.Threading.Thread&#xff0c;并为其指定一个回调方法&…

ASP.NET Core launchsettings.json文件(8)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 进程外(out-of-process)托管ASP.NET Core launchsettings.json文件在本视频中&#xff0c;我们将讨论在ASP.NET Core项目中launchsettings.json文件的重要性。launchsettings.json文件您将在项目根文件…

[CQOI2017] 老C的方块(网络流染色建图)

problem luogu-P3756 solution 据说要做网络流 24\text{24}24 题中的《方格取数问题》和《骑士共存问题》。 &#xff1f;&#xff1f;&#xff1f;那个不是直接最小割吗&#xff1f;哦原来是从黑白染色来理解的。我还是太水了。 这种题之所以能用网络流做&#xff0c;是因…

江湖召集:.NET开发者们看过来,这场长沙的开发者技术大会正是为你精心准备的大餐...

看过去&#xff0c;历史的尘埃与沧海桑田古语有云“近代中国&#xff0c;湖南独撑半边天”&#xff0c;湖南长沙&#xff0c;作为湖南省的省会&#xff0c;自古以来便是各界风云人士兴起之地。随着互联网时代的到来&#xff0c;长沙&#xff0c;这座历史悠久的文化名城&#xf…

C#并行编程(3):并行循环

初识并行循环并行循环主要用来处理数据并行的&#xff0c;如&#xff0c;同时对数组或列表中的多个数据执行相同的操作。在C#编程中&#xff0c;我们使用并行类System.Threading.Tasks.Parallel提供的静态方法Parallel.For和Parallel.ForEach来实现并行循环。从方法名可以看出&…

Acwing 252. 树

Acwing 252. 树 题意&#xff1a; 给定一个有 N 个点&#xff08;编号 0,1,…,N−1&#xff09;的树&#xff0c;每条边都有一个权值&#xff08;不超过 1000&#xff09;。 树上两个节点 x 与 y 之间的路径长度就是路径上各条边的权值之和。 求长度不超过 K 的路径有多少条…