牛客网-牛牛数星星

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/PZHU_CG_CSDN/article/details/80873704

链接:https://www.nowcoder.com/questionTerminal/1bf5b56583f747e98741e37652e5a63e?toCommentId=1451625
来源:牛客网

一闪一闪亮晶晶,满天都是小星星,牛牛晚上闲来无聊,便躺在床上数星星。
牛牛把星星图看成一个平面,左上角为原点(坐标为(1, 1))。现在有n颗星星,他给每颗星星都标上坐标(xi,yi),表示这颗星星在第x行,第y列。
现在,牛牛想问你m个问题,给你两个点的坐标(a1, b1)(a2,b2),表示一个矩形的左上角的点坐标和右下角的点坐标,请问在这个矩形内有多少颗星星(边界上的点也算是矩形内)。

输入描述:

第一行输入一个数字n(1≤n≤100000),表示星星的颗数。
接下来的n行,每行输入两个数xi和yi(1≤xi,yi≤1000),表示星星的位置。
然后输入一个数字m(1≤m≤100000), 表示牛牛询问问题的个数。
接下来m行,每行输入四个数字a1,b1,a2,b2(1≤a1<a2≤1000), (1≤b1<b2≤1000)
题目保证两颗星星不会存在于同一个位置。

输出描述:
输出一共包含m行,每行表示与之对应的每个问题的答案。

示例:

输入

4
1 1
2 2
3 3
1 3
4
1 1 2 2
1 1 3 3
2 2 3 3
1 2 2 3

输出

2
4
2
2

思路:暴力肯定是过不了的,可以记录源点到当前 (x,y) 所有的点数,我们只需要得到一个矩形范围内的星星的数量,我们就可以先跑一遍整个数据范围,找到这个点的左上方向一共有多少颗星星,并把它标记出来。那么,我们要得到的矩形范围内的星星数量就变为了这个矩形右下角的点的值减去这个矩形左下角左边那个点的值再减去这个矩形右上角上面那个点的值再加上这个矩形左上角的左上边那个点的值。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
const int maxn = 1000 + 5;
int m[maxn][maxn];
int num[maxn][maxn];
int n;
int cnt;

int main(void){
    cin>>n;
    int x,y;

    for(int i = 0;i < n;i++){
        cin>>x>>y;
        m[x][y]++;
    }

    for(int i = 0;i < maxn;i++)
        for(int j = 0;j < maxn;j++){
            num[i][j] = num[i-1][j] + num[i][j-1] + m[i][j] - num[i-1][j-1];
        }

    cin>>cnt;
    for(int i = 0;i < cnt;i++){
        int a1,b1,a2,b2;
        cin>>a1>>b1>>a2>>b2;
        cout<<num[a2][b2] - num[a1-1][b2] - num[a2][b1-1] + num[a1-1][b1-1]<<endl;
    }
    return 0;
}

图解:

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/PZHU_CG_CSDN/article/details/80873704
今日推荐