给定星星的位置,和起始亮度,求t时间后,位于x1,y1,x2,y2矩形内星星总亮度和,在边界上也算。
t时刻星星的亮度为起始亮度(si + t) % (c + 1),c为最大亮度。
重点是要快速求出给定矩形内的星星。
神奇的题解。。。
用cnt[s][x][y]记录起始亮度为s,(1,1)至(x,y)矩形内星星总数。
则给定矩形(x1,y1)至(x2,y2)内的星星数,可以用s从0到c,对cnt[s][x2][y2] - cnt[s][x1 - 1][y1] - cnt[x2][y1 - 1] + cnt[s][x1 - 1][y1 - 1]求和。
注意,应为边界也算在矩形,所以记得-1.
初始化时也是,cnt[s][x][y] = (x,y)处的亮度为s的星星数 + cnt[s][x - 1][y] + cnt[s][x][y - 1] - cnt[s][x - 1][y - 1]
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100 + 5;
const int maxc = 11;
int cnt[maxc][maxn][maxn];
int s[maxn][maxn];
int main()
{
int n,q,c;
scanf("%d%d%d",&n,&q,&c);
int x,y,si;
memset(cnt,0, sizeof(cnt));
for (int i = 0; i < n; i ++) {
scanf("%d%d%d",&x,&y,&si);
cnt[si][x][y] ++;
}
for (int i = 1; i < maxn; i ++) {
for (int j = 1; j < maxn; j ++) {
for (int k = 0; k <= c; k ++) {
cnt[k][i][j] = cnt[k][i][j] + cnt[k][i - 1][j] + cnt[k][i][j - 1] - cnt[k][i - 1][j - 1];
}
}
}
int t,x1,y1,x2,y2;
int sum = 0 ;
for (int i = 0; i < q; i ++) {
scanf("%d%d%d%d%d",&t,&x1,&y1,&x2,&y2);
sum = 0;
for (int k = 0; k <= c; k ++) {
sum += (cnt[k][x2][y2] - cnt[k][x1 - 1][y2] - cnt[k][x2][y1 - 1] + cnt[k][x1 - 1][y1 - 1]) * ((k + t % (c + 1)) % (c + 1));
}
printf("%d\n",sum);
}
return 0;
}