#include <iostream>
#include <cstdio>
#include <cstring >
#include <iostream>
using namespace std;
int mp[102][102][11];
int sum[102][102][11];
int main()
{
int n,q,c;
while(~scanf("%d%d%d",&n,&q,&c)) {
memset(mp,0,sizeof(mp));
for(int i = 0; i < n; i++) {
int x,y,s;
scanf("%d%d%d",&x,&y,&s);
mp[x][y][s]++; //记录地图 在(x,y)上 亮度为s的星星的个数 这里因为星星可以重叠在一个点 要用++
}
memset(sum,0,sizeof(sum));
for(int k = 0; k <= c; k++) {
for(int i = 1; i <= 100; i++) { //二维前缀和
for(int j = 1; j <= 100; j++) {
sum[i][j][k] = sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k]+mp[i][j][k]; //处理亮度为k的星星在(1,1)到(i,j)矩阵内的个数
}
}
}
for(int i = 0; i < q; i++) {
int t,x1,y1,x2,y2;
scanf("%d%d%d%d%d",&t,&x1,&y1,&x2,&y2);
int ans = 0;
int ans1;
for(int k = 0; k <= c; k++) {
ans1 = (k+t)%(c+1); // 计算亮度为k的星星在t秒后的亮度
int num = sum[x2][y2][k]-sum[x1-1][y2][k]-sum[x2][y1-1][k]+sum[x1-1][y1-1][k]; //计算 (x1,y1)到(x2,y2)矩阵内亮度为k的星星的个数
ans1 *= num;
ans += ans1;
}
printf("%d\n",ans);
}
}
}
二维前缀和 codeforces 832C
最新推荐文章于 2021-07-28 23:51:36 发布