CF427 C star sky 二维数组前缀和

用pre[t][i][j]存时间等价于t时坐标(1, 1) 和(i, j)组成的矩形区域的星星总亮度。再注意一下一个坐标处可以有多颗星星就可以了。

star sky

 1 // http://codeforces.com/contest/835/problem/C
 2 #include <cstdio>
 3 #include <cstring>
 4 const int M = 12, N = 102;
 5 int pre[M][N][N];
 6 int main()
 7 {
 8     int n, q, c;
 9     while(~scanf("%d%d%d", &n, &q, &c)) {
10         memset(pre, 0, sizeof pre);
11         c++;
12         int x, y, s;
13         while(n--) {
14             scanf("%d%d%d", &x, &y, &s);
15             for (int i = 0; i < c; ++i)
16                 pre[i][x][y] += (s + i) % c; //不易注意的地方,同一个坐标可能有多颗小星星
17         }
18         for (int t = 0; t < c; ++t) //时间t,求下二维前缀和
19             for (int i = 1; i <= 100; ++i)
20                 for (int j = 1; j <= 100; ++j)
21                     pre[t][i][j] += pre[t][i-1][j] + pre[t][i][j-1] - pre[t][i-1][j-1];
22         int t, x1, y1, x2, y2;
23         while(q--) {
24             scanf("%d%d%d%d%d", &t, &x1, &y1, &x2, &y2);
25             t %= c;
26             int sum = pre[t][x2][y2] - pre[t][x1-1][y2] - pre[t][x2][y1-1] + pre[t][x1-1][y1-1];
27             printf("%d\n", sum);
28         }
29     }
30
31     return 0;
32 }
时间: 2024-11-05 00:23:30

CF427 C star sky 二维数组前缀和的相关文章

洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的方格的列表.你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚.牛棚的边必须和水平轴或者垂直轴平行. EXAMPLE 考虑下面的方格,它表示农夫约翰的农场,‘.'表示没有树的方格,‘#'表示有树的方格 1 2 3 4 5 6 7 8 1 .

二维数组前缀和

给定一个矩阵,求子矩阵元素之和. 可以暴力遍历,但是一般题目时间上不会允许你这么做. 通过预处理二维数组使得需要子矩阵之和时以O(1)直接求. 输入: for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin >>map[i][j]; 记dp[i][j]表示左上坐标(1,1),右下坐标(i,j)的子矩阵,map[i][j]表示矩阵(i,j)位置上的元素. 那么通过:dp[i][j]=dp[i][j-1]+dp[i-1][j]-dp[i-1][j

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 #de

多线程技术模拟并行计算之二:数组前缀和(Prefix Sum)

一.前缀和(Prefix Sum)定义: 给定一个数组A[1..n],前缀和数组PrefixSum[1..n]定义为:PrefixSum[i] = A[0]+A[1]+...+A[i-1]: 例如:A[5,6,7,8] --> PrefixSum[5,11,18,26] PrefixSum[0] =A[0] ; PrefixSum[1] =A[0] + A[1] ; PrefixSum[2] =A[0] + A[1] + A[2] ; PrefixSum[3] =A[0] + A[1] + A[

剑指 offer 第一题: 二维数组中的查找

打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣 ?? 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析 图 1 如果没有头绪的话,很显然使用 暴力解法 是完全可以解决该问题的. 即遍历二维数组中的每一个元素,时间复杂度:O(n^2). 其实到这里我们就可以发现,使用这种暴力解法并没有充分利用题目给出的信息.这

14-高效求最长公共子序列(二维数组存不下)

/*                                   See LCS again时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述 There are A, B two sequences, the number of elements in the sequence is n.m; Each element in the sequence are different and less than 100000. Calculate the length

java基础:java中的二维数组

二维数组的概念: 一个元素为一维数组的数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的元素有多少个. 注意: A:以下格式也可以表示二维数组 a:数据类型 数组名[][] = new 数据类型[m][n]; b:数据类型[] 数组名[] = new 数据类型[m][n]; B:注意下面定义的区别 int x; int y; int x,y; int[] x; int[] y[]; int[] x,y[

二维数组

int[][]arr; arr=new int[5][6];//定义二维数组 int [][]grade=new int [5][6]//直接定义 for each循环:不使用下表就能访问: int=[]mum={12345} for(int a :m){ System.out.print(a)}  //num数组  a 12345;

二维数组与指针

二维数组: int / char / flaot a[n][m]; 可以看做是将一维数组做为基本类型产生的一维数组的数组类型,共n*m个最基本类型.这样看有许多优点(实际上计算机也是这样分配的). 二维数组数组名的注意事项: 1 #include <stdio.h> 2 int main() 3 { 4 int *p,a[3][4]; 5 p = a;//a是二维数组的首地址本质为行指针,原型为 a[][]:无法赋值给普通指针类型 *p: 6 return 0; 7 } 编译就会出现如下错误