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

题目链接:Codeforces Round #427 (Div. 2) C. Star sky

题意:

在一个二维平面上有n个星星,每个星星有一个初始的亮度,每过去一秒,星星的亮度变化为(s+1)%(c+1).

现在有q个询问,问t秒后一个矩形区域的星星的总亮度为多少。

题解:

由于c不大,将每颗星星按照初始亮点分类,每一类在任意时间的亮度都是相同的,然后对应加一加就行了。

 1 #include<bits/stdc++.h>
 2 #define RT(l,r) (l+r|l!=r)
 3 #define mst(a,b) memset(a,b,sizeof(a))
 4 #define F(i,a,b) for(int i=a;i<=b;++i)
 5 #define ___ freopen("c:\code\in.txt","r",stdin);
 6 using namespace std;
 7 typedef long long ll;
 8 typedef pair<int,int>P;
 9 
10 const int N=1e5+7;
11 
12 int n,q,c,mp[12][111][111];
13 
14 int sum(int v,int x,int y)
15 {
16     int ret = 0;
17     for(int i = x;i > 0;i -= i&-i)
18         for(int j = y;j > 0;j -= j&-j)
19             ret += mp[v][i][j];
20     return ret;
21 }
22 void add(int v,int x,int y,int val)
23 {
24     for(int i = x;i <= 100;i += i&-i)
25         for(int j = y;j <= 100;j += j&-j)
26             mp[v][i][j] += val;
27 }
28 
29 int get(int v,int x1,int y1,int x2,int y2)
30 {
31     return sum(v,x2,y2)-sum(v,x1-1,y2)-sum(v,x2,y1-1)+sum(v,x1-1,y1-1);
32 }
33 
34 int main()
35 {
36     scanf("%d%d%d",&n,&q,&c);
37     F(i,1,n)
38     {
39         int x,y,v;
40         scanf("%d%d%d",&x,&y,&v);
41         add(v,x,y,1);
42     }
43     F(i,1,q)
44     {
45         int t,x1,y1,x2,y2;
46         scanf("%d%d%d%d%d",&t,&x1,&y1,&x2,&y2);
47         t%=(c+1);
48         int ans=0;
49         F(j,0,c)
50         {
51             int tmp=(t+j)%(c+1);
52             ans+=tmp*get(j,x1,y1,x2,y2);
53         }
54         printf("%d
",ans);
55     }
56     return 0;
57 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/7271599.html