首页 > 其他分享 >关于前缀和

关于前缀和

时间:2023-09-30 09:16:12浏览次数:33  
标签:前缀 int Luogu 二维 关于 数组 预处理

Part1 前缀和

定义

前缀和可以简单理解为 "数列的前n项的和"

它是一种重要的预处理方式, 能大大降低查询的时间复杂度
一般来讲, 我们会预处理一个数组。对数组中每个元素, 我们记录从起始到该元素对应下标/状态所有数字的总和

一维前缀和

给定一个长度为\(n\) 的数组 \(a\), 预处理一个 \(f\) 数组作为前缀和, 即

\[f_i = \sum_{j=1}^{i} a_j = a_1 + a_2 + \cdots + a_i \]

二维前缀和

给定一个 \(n \times m\) 的数组 \(a\), 预处理一个 \(f\) 二维数组作为前缀和, 即

\[f_{i, j} = \sum_{k=1}^{i} \sum_{l=1}^{j}a_{k, l} = a_{1, 1} + a_{1, 2} + a_{1, j} + a_{2, 1} +\cdots + a_{i, j} \]

多维前缀和

可以类推

实现方式

一维前缀和

一般可以在线性时间内解决, 枚举 \(1-n\), 有公式

\[f_i = f_{i-1} + a_i \]

二维前缀和

枚举 \(1-n\), \(1-m\), 有公式

\[f_{i, j} = f_{i-1, j} + f_{i, j-1} - f_{i-1, j-1} + a_{i, j} \]

多维前缀和

可以使用容斥计算

Code

一维前缀和

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m, a[N], f[N];
int main()
{
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
  {
    scanf("%d", &a[i]);
    f[i] = f[i - 1] + a[i];
  } 
  for (int i = 1; i <= m; i++)
  {
    scanf("%d%d", &l, &r);
    printf("%d", f[r] - f[l - 1]);
  }
  return 0;
}

二维前缀和

#include<bits/stdc++.h>
using namespace std;
const int N =  1e4 + 10; 
int n, m, k;
int x1, y1, x2, y2;  
int a[N][N], f[N][N];
int main()  
{
	scanf("%d%d%d", &n, &m, &k);
  	for (int i = 1; i <= n; i++)
	for (int j = 1; j <= m; j++)
  	scanf("%d", &a[i][j]), f[i][j] = f[i][j-1] + f[i-1][j] - f[i-1][j-1] + a[i][j];
  	for (int i = 1; i <= k; i++)
	{
		scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
		int l = f[x2][y2] + f[x1-1][y1-1] - f[x1-1][y2] - f[x2][y1-1];
		printf("%d\n", l);
	}
	return 0;                          
                          

Part2.1 习题

Luogu P2697 宝石串
Solution

Luogu P8218 求区间和
Solution

Part2.2 习题

Luogu P1719 最大加权矩形

Luogu P1387 最大正方形

Luogu P2004 领地选择

Luogu P2280 [HNOI2003]激光炸弹

Luogu P3397 地毯
Solution

Luogu P7741 [AHOI2007] 石块地板

参考

OI-WiKi

标签:前缀,int,Luogu,二维,关于,数组,预处理
From: https://www.cnblogs.com/Gmor-cerr-blog/p/17429209.html

相关文章

  • 关于人工智能的一些思考
    关于人工智能的一些思考——读《人工智能的第一性原理是什么》的感悟ChatGPT来了,AGI还远吗?这不是蒸汽到电气的飞跃变革,而是蒸汽机在新机器上的应用变革。GPT-3没有产生技术革命,只是在应用上取得了重大突破清华大学张钹院士:在探索通往AGI的道路上,“现在走得并不远,在出发点......
  • 《Java编程思想第四版》学习笔记32--关于static字段的序列化
    //:CADState.java//Savingandrestoringthestateofa//pretendCADsystem.importjava.io.*;importjava.util.*;abstractclassShapeimplementsSerializable{publicstaticfinalintRED=1,BLUE=2,GREEN=3;privateintxPos,yPos,dimension;p......
  • 关于我自己
    HelloWorld烧开后撒火炬大厦的括号洒家是可监控、的卡萨巨好看是计算机和时间的撒假当时#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);return0;}......
  • 关于一个django工程如何与达梦数据库连接的全程总结
    关于一个django工程如何与达梦数据库连接的全程总结目录1.达梦数据库的安装(win、图形化工具)2.DM管理工具的基本使用:表空间的建删用户的管理模式的建删表的创建、删除、查看3.Django项目接入dm数据库settings的database配置解释器中的相关包dmPython的编译※环境准备正式编......
  • 加训日记 Day8——关于cf一道题调了半天这件事
    Day8,9.28  ·国庆假期前狠狠刷cf  ·把之前比赛的题目基本上都补了(牛客的没来得及补)  ·这一个星期日均四道题,确实挺不错的  ·思维还是跟不上捏......
  • 关于博客的想法
    为什么要写博客  虽然简单的说只是记录和梳理自己学到的东西,但我们这些搞IT的尤其喜欢写博客,这其中自然有软件开发相关技术庞杂,而且技术框架的迭代演进也很快,今天有个高可用的框架出来,明天有个更可靠的RPC组件发布,虽说学不动这句话大家常挂在嘴边,不过有新的更好的技术出来我们......
  • 关于五红犬的小知识
    最近刷到了一些关于五红犬的视频了,所以就找养狗的朋友了解了一下五红犬。怎么说呢,五红犬的优点一大堆,大部分人都能知道,所以今天我就来说一下他的两个“相对缺点”,为什么说是“相对缺点”呢,因为看你有些人觉得这种反而是他们眼中的有点。首先第一点,五红犬极度认主。这个极度认主......
  • 关于数据结构树的概括
    树结构是一种非常重要且广泛应用的数据结构。它以节点和边的形式组织数据,具有层次关系和递归性质。树结构在计算机科学领域中有着广泛的应用,例如文件系统、数据库索引、网络路由等。一、什么是树树是数据结构中的一种,其属于非线性数据结构结构的一种,我们前文所提到的数据结构多数......
  • 关于数据结构树的概括
    树结构是一种非常重要且广泛应用的数据结构。它以节点和边的形式组织数据,具有层次关系和递归性质。树结构在计算机科学领域中有着广泛的应用,例如文件系统、数据库索引、网络路由等。一、什么是树树是数据结构中的一种,其属于非线性数据结构结构的一种,我们前文所提到的数据结构多数都......
  • destoon关于archiver归档的性能优化
    今天在处理一个项目时候发现archiver单个模块归档超过百万数据,打开速度就特慢,所以打开archiver下index.php文件进行分析,发现有句sql作怪1$result = $db->query("SELECTtitle,linkurl,addtimeFROM{$table}WHERE$conditionORDERBYaddtimeDESCLIMIT$offset,......