2020.02.16普及C组模拟赛7(第二题)

2.方格纸(square)

题目描述

今天小D在他的课桌上玩方格纸,现在有一个平面直角坐标系,小D将方块纸放在这个坐标系中,并且方格纸的都与x轴、y轴平行,小D在这上面放了许多的方格纸,然后想知道对于平面直角坐标系中的一个点有多少个方格纸覆盖(包括方格纸的边和点),因为方格纸太多了,所以请聪明的你帮小D解决问题。

输入

第一行 一个正整数N,接下来N行 每行四个正整数x1,y1,x2,y2,分别表示方格纸左下角的坐标和右上角的坐标。
第n+2行一个正整数Q,接下来Q行 每行两个正整数x,y,表示询问点的坐标。

输出

一共Q行,表示对应坐标。

样例输入

3
1 1 5 5
2 2 6 6
3 1 4 3
2
2 2
4 3

样例输出

2
3

数据范围限制

30%的数据, N*Q≤10^7。
100%的数据, N,Q≤10^5,0<x1,y1,x2,y2,x,y≤3000。

正解
二维拆分
AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,q,x,y,x1,y1,x2,y2;
long long a[3005][3005],b[3005][3005];
int main()
{
	freopen("square.in","r",stdin);
	freopen("square.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
    {
    	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		a[x1][y1]++;//二维拆分
		a[x2+1][y1]--;
		a[x1][y2+1]--;
		a[x2+1][y2+1]++;	
	}
	for(int i=1;i<=3000;i++)//二维前缀和
	 for(int j=1;j<=3000;j++)
	  b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
    cin>>q;
	for(int i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		printf("%lld\n",b[x][y]);
	} 
	return 0;
}

下面附本次比赛的其他题目

2020.02.16普及C组模拟赛7(第一题)
2020.02.16普及C组模拟赛7(第二题)
2020.02.16普及C组模拟赛7(第三题)
2020.02.16普及C组模拟赛7(第四题)
2020.02.16普及C组模拟赛7(总结)

谢谢

发布了75 篇原创文章 · 获赞 104 · 访问量 2394

猜你喜欢

转载自blog.csdn.net/weixin_45524309/article/details/104543893