牛客小白月赛24 D.牛妹吃豆子

牛客小白月赛24 D.牛妹吃豆子

题目链接

题目描述

牛妹为了打比赛经常不吃饭,但是牛妹非常喜欢吃豆子,她经常会吃很多很多的豆子,所以牛妹不会感觉到饿, 自然就不想吃饭了。
现在牛妹有一个 n∗m 个格子的棋盘.左下角的格子坐标为 (1, 1), 右上角的格子坐标为 (n,m).棋盘的每个格子都能放任意个豆子.
这时牛可乐带着一袋豆子走了过来, 打算跟牛妹分享这些豆子, 但是牛可乐并不想就这么简单的让牛妹吃到豆子, 所以牛可乐给牛妹出了一个难题.
现在牛可乐有 k 次操作,每次操作给出四个数字 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 : 表示牛可乐会将所有满足 x 1 x x 2 y 1 y y 2 x_1\leq x\leq x_2,y_1\leq y \leq y_2 这两个条件的位置上放一个豆子。
牛可乐放完豆子后给出了 q 次询问, 每次询问给出四个数字 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 : 表示询问所有满足 x 1 x x 2 y 1 y y 2 x_1\leq x\leq x_2,y_1\leq y \leq y_2 这两个条件的位置上中总共有多少个豆子.
这个问题可难住牛妹了, 牛妹想要吃到豆子就必须答对牛可乐的所有询问。

输入描述:

输入一行四个数字 n,m,k,q

n,m 表示棋盘的大小.有 k 次操作和 q 次询问

下面 k 行,每行四个数字 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2

表示牛可乐会将所有满足 x 1 x x 2 , y 1 y y 2 x_1\leq x\leq x_2,y_1\leq y\leq y_2 这两个条件的位置上放一个豆子。

下面 q 行,每行四个数字 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2

表示询问所有满足 x 1 x x 2 , y 1 y y 2 x_1\leq x\leq x_2,y_1\leq y\leq y_2 这两个条件的位置上中总共有多少个豆子。

输出描述:

每次询问,输出一行一个数字表示答案。

示例1

输入

2 2 1 1
1 1 2 2
1 1 2 1

输出

2

典型的二维前缀和问题,对修改操作,我们可以记录四个点的值来维护一块子阵,然后求一次二维前缀和得到矩阵,再求一次二维前缀和得到子阵和即可,AC代码如下,做这道题还发现了一个有趣的点,如果各位定义了 y 1 y_1 这个全局变量评测机是会报错的,因为 m a t h . h math.h 库里面有 y 1 y_1 这个函数,相当于你重定义了,所以会 CE,解决办法就改一个变量名或者放在 m a i n main 函数里就好了:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+5;
ll f[N][N]={0};
int main()
{
    int n,m,k,q,x1,y1,x2,y2;
    scanf("%d%d%d%d",&n,&m,&k,&q);
    while(k--){
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        f[x1][y1]++;
        f[x2+1][y2+1]++;
        f[x2+1][y1]--;
        f[x1][y2+1]--;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
    }
    while(q--){
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        printf("%lld\n",f[x1-1][y1-1]+f[x2][y2]-f[x1-1][y2]-f[x2][y1-1]);
    }
    return 0;
}
发布了479 篇原创文章 · 获赞 38 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/105612505