一维前缀和

795. 前缀和

  • a[i] 的前 i 项和 s[i] 的递推公式:s[i]=s[i−1]+a[i]s[i] = s[i - 1] + a[i]s[i]=s[i−1]+a[i]
  • 求出在 [l, r] 区间的和:sum[l,r]=s[r]−s[l−1]sum[l,r]=s[r]-s[l-1]sum[l,r]=s[r]−s[l−1]
  • 注意 a[i] 和 s[i] 均从下标1开始记录数据
import java.util.*;
import java.io.*;public class Main {BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int[] a, s;int n, m;int l, r;void run() throws Exception {String[] split = reader.readLine().split(" ");n = Integer.parseInt(split[0]);m = Integer.parseInt(split[1]);a = new int[n + 1];s = new int[n + 1];split = reader.readLine().split(" ");for (int i = 1; i <= n; i++) {a[i] = Integer.parseInt(split[i - 1]);}for (int i = 1; i <= n; i++) {s[i] = s[i - 1] + a[i];}while (m-- > 0) {split = reader.readLine().split(" ");l = Integer.parseInt(split[0]);r = Integer.parseInt(split[1]);log.write(s[r] - s[l - 1] + "\n");}log.flush();log.close();reader.close();}public static void main(String[] args) throws Exception {new Main().run();}

二维前缀和

796. 子矩阵的和

  • 前缀和矩阵递推式:Sx,y=Sx−1,y+Sx,y−1−Sx−1,y−1+Ax,yS_{x,y}=S_{x-1,y}+S_{x,y-1}-S_{x-1,y-1}+A_{x,y}Sx,y​=Sx−1,y​+Sx,y−1​−Sx−1,y−1​+Ax,y​
  • 主对角线两端点值为[(x1,y1),(x2,y2)][(x_1,y_1),(x_2,y_2)][(x1​,y1​),(x2​,y2​)]的子矩阵和:sum[(x1,y1),(x2,y2)]=Sx2,y2−Sx1−1,y2−Sx2,y1−1+Sx1−1,y1−1sum[(x_1,y_1),(x_2,y_2)]=S_{x_2,y_2}-S_{x_1-1,y2}-S_{x_2,y_1-1}+S_{x_1-1,y_1-1}sum[(x1​,y1​),(x2​,y2​)]=Sx2​,y2​​−Sx1​−1,y2​−Sx2​,y1​−1​+Sx1​−1,y1​−1​
  • 注意:矩阵的行列均从下标1开始记录数据
  • 用一个3x3矩阵来推导:
    • 前缀和矩阵:先加原矩阵上面和左边的2x3和3x2矩阵,再减去左上角的2x2矩阵,最后加上Ax,yA_{x,y}Ax,y​
    • 由前缀和矩阵求子矩阵和 :用大矩阵减去上面1x3和左边的3x1小矩阵,最后加回一次左上角的1x1矩阵
import java.util.*;
import java.io.*;class Main {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));String[] split;int n, m, q;int[][] matrix;int[][] s;int x1, y1, x2, y2;void run() throws Exception {split = reader.readLine().split(" ");n = Integer.valueOf(split[0]);m = Integer.valueOf(split[1]);q = Integer.valueOf(split[2]);matrix = new int[n + 1][m + 1];s = new int[n + 1][m + 1];for (int i = 1; i <= n; i++) {split = reader.readLine().split(" ");for (int j = 1; j <= m; j++) {matrix[i][j] = Integer.valueOf(split[j - 1]);}}// 求出前缀和矩阵for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + matrix[i][j];}}while (q-- > 0) {split = reader.readLine().split(" ");x1 = Integer.valueOf(split[0]);y1 = Integer.valueOf(split[1]);x2 = Integer.valueOf(split[2]);y2 = Integer.valueOf(split[3]);log.write(s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1] + "\n");}log.flush();}public static void main(String[] args) throws Exception {new Main().run();}
}

模版 ----- 一维前缀和与二维前缀和相关推荐

  1. 前缀和、二维前缀和与差分的小总结

    在了解二维前缀和之前,我们首先需要了解一下什么是前缀和. 如果我给你一串长度为n的数列a1,a2,a3......an,再给出m个询问,每次询问给出L,R两个数,要求给出区间[L,R]里的数的和,你会 ...

  2. 一维前缀和,二维前缀和,一维差分,二维差分(翻译)

    练习一道题目 输入一个长度为n的整数序列. 接下来再输入m个询问,每个询问输入一对l, r. 对于每个询问,输出原序列中从第l个数到第r个数的和. 输入格式 第一行包含两个整数n和m. 第二行包含n个 ...

  3. 一维前缀和与二维前缀和

    前缀和 #一维前缀和: 1) 其实就是数列的前n项和,直接放代码:` sum[1]=a[1];for(int i=2;i<=n;i++)sum[i]=sum[i-1]+a[i];/*其实也可以不 ...

  4. 【算法】前缀和(一维前缀和与二维前缀和)

    前缀和是一种重要的预处理,能大大降低查询的时间复杂度. [一维前缀和] 给定一个数组A[1,2,--n],则它的前缀和数组为PrefixSum[1..n].定义为:PrefixSum[i] = A[0 ...

  5. 前缀和【一维前缀和与二维前缀和】

    全文目录

  6. 【题集】一维前缀和-二维前缀和-数星星问题-反复运行时如何降低时间复杂度

    目录 1前缀和 1.1一维前缀和 1.2二维前缀和 2.题目 2.1输入描述: 2.2输出描述: 2.3输入 2.4输出 3.题目理解 3.1思路 4.程序 4.1运行结果 1前缀和 1.1一维前缀和 ...

  7. 【CS 1373】射命丸文(二维前缀和)

    emmmm又是一个东方人物[好吧这不是重点],下面的前缀和和二维前缀和才是23333 去寻找偷拍记者吧 题目描述 Description 在幻想乡,射命丸文是以偷拍闻名的鸦天狗.当然,文文的照相机可不 ...

  8. 牛妹吃豆子(二维前缀和模板,修改+求和)

    调了半天忘了要求两次前缀和了. 先对前缀和数组进行修改, 第一次求前缀和得到的是修改后的原矩阵,再求一次前缀和得到二维前缀和,然后根据容斥定理求区间的二维前缀和即可 #include<iostr ...

  9. leetcode 304. Range Sum Query 2D - Immutable |304. 二维区域和检索 - 矩阵不可变(二维前缀和问题)

    题目 https://leetcode.com/problems/range-sum-query-2d-immutable/ 题解 本题是 medium 难度,二维前缀和问题.相似题目有: Easy: ...

最新文章

  1. MySQL之主从切换
  2. GO学习第一天——环境搭建
  3. 比特币现金支付接入日本便利店
  4. ps高级磨皮的7个步骤
  5. 采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录
  6. mysql起止时间怎么写_【Mysql 学习】日期函数函数
  7. auto的作用c语言,auto指的是什么意思
  8. js 中的class
  9. UVA 10791 Minimum Sum LCM 数论
  10. 430.扁平化多级双向链表
  11. javawebday30(验证码在客户端 用当前时间来请求下一张图片 VerifyCode代码)
  12. Apache CXF 框架结构和基本原理
  13. Simulink 环境基础知识(四)--保存模型
  14. 电脑更改IP地址后,Oracle数据库需要重新配置IP问题(一招搞定,永久有效)
  15. 记苹果企业开发者账号申请踩过的坑
  16. Windows 2003企业版安装篇
  17. 中国多媒体与网络教学学报杂志中国多媒体与网络教学学报杂志社中国多媒体与网络教学学报编辑部2022年第6期目录
  18. 网络对抗 Exp6 信息收集与漏洞扫描 20154311 王卓然
  19. topcoder赚钱的方法
  20. salmon的报错解决error while loading shared libraries: libboost_iostreams.so.1.60.0

热门文章

  1. Dangling Javadoc comment
  2. 种树(codevs 1768)
  3. leetcode_最长公共前缀
  4. 《Algorithms》常见排序算法比较
  5. 校招刷题---java选择题笔记01
  6. 【网络安全入门大总结】—Java语言中常用的渗透漏洞大汇总
  7. cgi web页面传入命令
  8. 读书笔记_中国期货市场量化交易(李尉)04
  9. 使命召唤16计算机内存不足,使命召唤16出现一个问题怎么解决
  10. 中gcd函数_函数和模块的使用