Codeforces Round #427 (Div. 2) C. Star sky(二维前缀和+思维)

题目链接
在这里插入图片描述
在这里插入图片描述
题意:在一个二维平面内有n个星星,每个星星有一个亮度值,在初始时为s,每过一秒数值增加1,数值不超过c,当超过c时亮度值变为0,然后再次循环。询问q次,每次询问在t时刻从左下角(x1,y1)到右上角(x2,y2)的矩形区域内所有星星的亮度总和是多少。
思路:我们为了简单化可以设置一个三维数组num【i】【j】【x】代表初始亮度为i,坐标为(j,x)的点的数量(也可以看成这个点的点权),由于第一维的范围是小于10的,所以完全可以存的下,我们再计算一下每个亮度的二维前缀和就行了。

#include<bits/stdc++.h> 
#define ll long long
using namespace std;
const int maxn=105;
const int m=11; 
ll dp[m][maxn][maxn],num[m][maxn][maxn];
int main()
{
	int n,q,c,x,y,z;
	scanf("%d %d %d",&n,&q,&c);
	for(int i=1;i<=n;++i) scanf("%d %d %d",&x,&y,&z),num[z][x][y]++;
	for(int i=0;i<=c;++i)
	for(int j=1;j<maxn;++j)
	for(int k=1;k<maxn;++k)
	dp[i][j][k]=dp[i][j-1][k]+dp[i][j][k-1]-dp[i][j-1][k-1]+num[i][j][k];
	while(q--)
	{
		ll t,x1,x2,y1,y2,ans=0,x;
		scanf("%lld %lld %lld %lld %lld",&t,&x1,&y1,&x2,&y2);
		for(int i=0;i<=c;++i)
		{
			x=dp[i][x2][y2]-dp[i][x1-1][y2]-dp[i][x2][y1-1]+dp[i][x1-1][y1-1];
			ans+=((i+t)%(c+1))*x;
		}
		printf("%lld\n",ans);
	}
}
发布了328 篇原创文章 · 获赞 1 · 访问量 9096

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/105229459