牛客小白月赛24 D.牛妹吃豆子
题目描述
牛妹为了打比赛经常不吃饭,但是牛妹非常喜欢吃豆子,她经常会吃很多很多的豆子,所以牛妹不会感觉到饿, 自然就不想吃饭了。
现在牛妹有一个 n∗m 个格子的棋盘.左下角的格子坐标为 (1, 1), 右上角的格子坐标为 (n,m).棋盘的每个格子都能放任意个豆子.
这时牛可乐带着一袋豆子走了过来, 打算跟牛妹分享这些豆子, 但是牛可乐并不想就这么简单的让牛妹吃到豆子, 所以牛可乐给牛妹出了一个难题.
现在牛可乐有 k 次操作,每次操作给出四个数字
: 表示牛可乐会将所有满足
这两个条件的位置上放一个豆子。
牛可乐放完豆子后给出了 q 次询问, 每次询问给出四个数字
: 表示询问所有满足
这两个条件的位置上中总共有多少个豆子.
这个问题可难住牛妹了, 牛妹想要吃到豆子就必须答对牛可乐的所有询问。
输入描述:
输入一行四个数字 n,m,k,q
n,m 表示棋盘的大小.有 k 次操作和 q 次询问
下面 k 行,每行四个数字
表示牛可乐会将所有满足 这两个条件的位置上放一个豆子。
下面 q 行,每行四个数字
表示询问所有满足 这两个条件的位置上中总共有多少个豆子。
输出描述:
每次询问,输出一行一个数字表示答案。
示例1
输入
2 2 1 1
1 1 2 2
1 1 2 1
输出
2
典型的二维前缀和问题,对修改操作,我们可以记录四个点的值来维护一块子阵,然后求一次二维前缀和得到矩阵,再求一次二维前缀和得到子阵和即可,AC代码如下,做这道题还发现了一个有趣的点,如果各位定义了 这个全局变量评测机是会报错的,因为 库里面有 这个函数,相当于你重定义了,所以会 CE,解决办法就改一个变量名或者放在 函数里就好了:
#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;
}