2802: 来自学长的善意:女学长的淘金之旅——Power OJ

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



解题思路:这是一个二维前缀和模板题

#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;
}


发布了36 篇原创文章 · 获赞 10 · 访问量 1922

猜你喜欢

转载自blog.csdn.net/weixin_44003265/article/details/97626632
OJ