Codeforces #835C: Star Sky 题解

首先,虽然观测的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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值