首先,虽然观测的t很大,但是每过c+1秒星星的亮度和之前的就一样了,所以可以将t mod c+1,这样t<=c
离线处理所有的询问
因为c的范围很小,枚举所有的t,将t相同的询问放在一起处理
对于每个t,先把星星的亮度求出来,存进数组,然后对数组做一个前缀和,就可以O(100)的处理所有当前t的询问
复杂度。。。大概是O(n*c)的吧
注意星星的坐标可能会重合
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <utility>
#include <map>
#include <stack>
#include <set>
#include <vector>
#include <queue>
#include <deque>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define LL long long
#define Pair pair<int,int>
#define LOWBIT(x) x & (-x)
using namespace std;
const int MOD=1e9+7;
const int INF=0x7ffffff;
const int magic=348;
int a[148][148];
int b[148][148];
int sum[148][148];
int n,q,c;
int ans[100048];
struct node
{
int num;
int t,x1,x2,y1,y2;
}s[100048];
vector<node> v[20];
struct node2
{
int x,y;
int p;
}star[100048];
int main ()
{
int i,j,x,y,p,x1,x2,y1,y2;
scanf("%d%d%d",&n,&q,&c);
for (i=1;i<=100;i++)
for (j=1;j<=100;j++)
a[i][j]=-1;
for (i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&p);
star[i].x=x;star[i].y=y;star[i].p=p;
}
for (i=1;i<=q;i++)
{
scanf("%d%d%d%d%d",&s[i].t,&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);
s[i].t%=(c+1);s[i].num=i;
v[s[i].t].pb(s[i]);
}
for (int u=0;u<=c;u++)
{
if (v[u].size()==0) continue;
for (i=1;i<=100;i++)
for (j=1;j<=100;j++)
b[i][j]=0;
for (i=1;i<=n;i++)
{
x=star[i].x;y=star[i].y;p=star[i].p;
p+=u;p%=(c+1);
b[x][y]+=p;
}
for (i=1;i<=100;i++)
{
sum[i][0]=0;
for (j=1;j<=100;j++)
sum[i][j]=sum[i][j-1]+b[i][j];
}
for (i=0;i<v[u].size();i++)
{
x1=v[u][i].x1;x2=v[u][i].x2;y1=v[u][i].y1;y2=v[u][i].y2;
//if (x1>x2) swap(x1,x2);
//if (y1>y2) swap(y1,y2);
//cout<<x1<<' '<<x2<<' '<<y1<<' '<<y2<<endl;
int ss=0;
for (j=x1;j<=x2;j++) ss+=sum[j][y2]-sum[j][y1-1];
//cout<<ss<<"*"<<endl;
ans[v[u][i].num]=ss;
}
}
for (i=1;i<=q;i++) printf("%d\n",ans[i]);
return 0;
}