Description
女学长非常喜欢梳妆打扮,买了许多化妆品,所以常常生活费不够用。没办法,只能去沙漠淘金。
于是她来到遍地黄金的西科大沙漠,看着满地的黄金,女学长抑制不住内心的激动(满脸写着开心),
一整年的生活费都够了。可以想象沙漠在笛卡尔坐标上,这里有n块黄金,每块黄金都有相应的价值vi和坐标(xi,yi)。
不过女学长想得到这些黄金并不是那么容易,因为沙漠里有一个邪恶的守护神yxz,想要得到黄金就得正确回答他的问题,
而他总是喜欢提出一些刁难的问题。给出q次询问,每次给出x1,y1,x2,y2 四个整数,x1,y1为矩形左下角的坐标,x2,y2,为矩形右上角的坐标,
计算出矩形里(含边上)的黄金总价值。
女学长觉得这些题太难了,于是寻求聪明的你来帮忙,如果你能帮女学长得到这些黄金,她请你吃黄焖鸡,外加一根烤肠!
Input
第一行有2个整数n,q;(0<=n<=1000,1<=q<=1e6)
接下来有n行,每行3个整数vi,xi,yi(1<=v,xi,yi<=1000),代表第i块黄金的价值和坐标;
接下来有q行,每行4个整数x1,y1,x2,y2(1 <= x1 <= x2 <= 1000,1 <= y1 <= y2 <= 1000),代表第i个问题的矩形的坐标;
Output
输出q行,对于每一次询问,输出相应的答案;
Sample Input
Raw
2 2
1 1 1
1 1 2
1 1 1 2
1 1 2 1
Sample Output
Raw
2
1
解题思路:这是一个二维前缀和模板题
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 1005;
int a[maxn][maxn];
int main()
{
int n,q;
int v,x,y,x1,x2,y1,y2;
while(~scanf("%d%d",&n,&q)){
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
scanf("%d%d%d",&v,&x,&y);
a[x][y]+=v;//一个位置上的黄金可能不止一块
}
for(int i=1;i<1001;i++)//求前缀和
for(int j=1;j<1001;j++)
a[i][j]+=a[i][j-1]-a[i-1][j-1]+a[i-1][j];
while(q--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d\n",a[x2][y2]-a[x2][y1-1]-a[x1-1][y2]+a[x1-1][y1-1]);
}
}
return 0;
}