题目链接:Star sky
题意:给你n个点,每个点有初始亮度,每过一秒钟亮度加一,亮度最多为c,超过变为零,不断循环。有q次询问,每次询问t秒时刻某个矩阵的亮度总和。
solution:暴力会超时,可以预先处理0秒时刻亮度的前缀。
#include <bits/stdc++.h> int mp[200][200][20]; int cnt; int main() { // freopen("in.txt","r",stdin); int n,q,c; int x,y,s; scanf("%d%d%d",&n,&q,&c); for(int i=0; i<n; ++i) { scanf("%d%d%d",&x,&y,&s); mp[x][y][s]++; } for(int x=1; x<=100; ++x) { for(int y=1; y<=100; ++y) { for(int k=0; k<=c; ++k) { mp[x][y][k]+=mp[x-1][y][k]+mp[x][y-1][k]-mp[x-1][y-1][k]; } } } // for(int k=0; k<=1; ++k) // { // for(int x=1; x<=3; ++x) // { // for(int y=1; y<=3; ++y) // { // printf("%d ",mp[x][y][k]); // // } // printf("\n"); // } // } int t,x1,x2,y1,y2; for(int i=0; i<q; ++i) { int sum=0; scanf("%d%d%d%d%d",&t,&x1,&y1,&x2,&y2); for(int k=0; k<=c; ++k) { int q=(k+t)%(c+1); sum+=q*(mp[x2][y2][k]-mp[x2][y1-1][k]-mp[x1-1][y2][k]+mp[x1-1][y1-1][k]); } printf("%d\n",sum); } return 0; }