您的位置:首页 > 其它

Codeforces 835 C Star sky(前缀和)

2017-08-01 17:26 585 查看
题目地址

题意:给你n个星星的位置和初始亮度值,他给你个最大亮度,每时间+1,他的亮度+1,当他的亮度大于最大亮度的时候就变为0,然后之后照常+1,然后给你一个矩形区间以及时间,求这个区间当时的亮度值、

思路:最开始写了半天的线段树,还想了一些减少时间的操作但是还是顺利的TLE了,其实这题就是一道前缀和的题目,num[x][y][k]代表的是位于(x,y)亮度为k的星星有多少颗,你根据x或者y来求前缀和就好了,然后然后当前是有星星的并且亮度一样就把星星的个数与求出来的当前亮度做乘积就好了。

PS:星星是可能重复的

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define N 110
#define LL long long
#define inf 0x3f3f3f3f
#define lson l,mid,ans<<1
#define rson mid+1,r,ans<<1|1
using namespace std;
const LL mod = 1e9 + 7;
const double eps = 1e-9;
int num

[11];
int main(void) {
int n, q, c, x, y, v;
scanf("%d %d %d", &n, &q, &c);
for (int i = 0; i < n; i++) {
scanf("%d %d %d", &x, &y, &v);
num[x][y][v] += 1;
}
for (int i = 1; i < N; i++) {
for (int j = 1; j < N; j++) {
for (int k = 0; k <= c; k++) {
num[i][j][k] += num[i][j - 1][k];
}
}
}
while (q--) {
int t, x1, y1, x2, y2;
LL ans = 0;
scanf("%d %d %d %d %d", &t, &x1, &y1, &x2, &y2);
for (int i = x1; i <= x2; i++) {
for (int j = 0; j <= c; j++) {
int cnt = (j + t) % (c + 1);
ans += (num[i][y2][j] - num[i][y1 - 1][j]) * cnt;
}
}
printf("%lld\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: