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

本文介绍了一种处理星星亮度查询的问题解决思路与实现代码。给定星星的位置与初始亮度,在平面中建立多个前缀和数组来记录不同时间点星星亮度的变化情况,通过查询特定时间点上任意矩形区域内的星星亮度总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给定n个星星(可能会重),q次查询,最大的亮度c(<=10),然后每个星星都在一个平面上(<=100×100),星星从初始亮度si到c一个时刻一个时刻地变换(si=c+1时,si变为0),每次查询在t时间从(x1,y1)到(x2,y2)矩形内的所有星星的亮度总和。

思路:

在平面上建立前缀和,因为至多有c+1种时刻,而c<=10,所以完全可以建立c+1个前缀和。在查询时,通过t找到相对应的时刻,然后矩形内的亮度和就等于sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];


代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5;
struct node
{
	int x, y, w;
} num[maxn];
int sum[15][105][105], a[105][105];
int n, q, c;
void init()
{
	memset(sum, 0, sizeof sum);
	for(int t = 0; t <= 10; ++t)
	{
		memset(a, 0, sizeof a);
		for(int i = 1; i <= n; ++i)
		a[num[i].x][num[i].y] += num[i].w;
		for(int i = 1; i <= 100; ++i)
		for(int j = 1; j <= 100; ++j)
		{
			sum[t][i][j] = sum[t][i-1][j]+sum[t][i][j-1]-sum[t][i-1][j-1]+a[i][j];
		}
		for(int i = 1; i <= n; ++i)
		{
			++num[i].w;
			num[i].w %= (c+1);
		}
	}
}
int main()
{
	int x1, y1, x2, y2, w, t, ans;
	scanf("%d %d %d", &n, &q, &c);
	for(int i = 1; i <= n; ++i)
	scanf("%d %d %d", &num[i].x, &num[i].y, &num[i].w);
	init();
	for(int _ = 1; _ <= q; ++_)
	{
		scanf("%d %d %d %d %d", &t, &x1, &y1, &x2, &y2);
		t %= (c+1);
		ans = sum[t][x2][y2]-sum[t][x2][y1-1]-sum[t][x1-1][y2]+sum[t][x1-1][y1-1];
		printf("%d\n", ans);
	}
	return 0;
}

继续加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值