首页 > 编程语言 >【基础算法】前缀和

【基础算法】前缀和

时间:2024-03-03 20:26:17浏览次数:20  
标签:y2 前缀 int 基础 cin 算法 y1 x1

前缀和

为什么要学前缀和?

例题:一维前缀和

暴力解法

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
int a[N];
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	while (m--)
	{
		int l, r;
		cin >> l >> r;
		int res = 0;
		for (int i = l; i <= r; i++)
		{
			res += a[i];
		}
		cout << res << endl;
	}
	return 0;
}

一维前缀和推导:

\(S_i=a_1+a_2+...+a_i\)

\(S_r-S_{l-1}=a_l+a_{l+1}+...+a_r\)

标准前缀和解法

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
int a[N], s[N];
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		s[i] = s[i - 1] + a[i];// 初始化了前缀和数组
	}
	while (m--)
	{
		int l, r;
		cin >> l >> r;
		cout << s[r] - s[l - 1] << endl;
	}
	return 0;
}

例题:二维前缀和

暴力解法

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, q;
int a[N][N];
int main()
{
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			cin >> a[i][j];
	while (q--)
	{
		int x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;
		int res = 0;
		for (int i = x1; i <= x2; i++)
			for (int j = y1; j <= y2; j++)
				res += a[i][j];
		cout << res << endl;
	}
	return 0;
}

二维前缀和推导:

\(S_{i,j}=S_{i-1,j}+S_{i,j-1}-S_{i-1,j-1}+a_{i,j}\)

\(res=S_{x_2,y_2}-S_{x_1-1,y_2}-S_{x_2,y_1-1}+S_{x_1-1,y_1-1}\)

标准二维前缀和解法

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, q;
int a[N][N], s[N][N];
int main()
{
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			cin >> a[i][j];
			s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j]; // 二维前缀和的初始化
		}
	while (q--)
	{
		int x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;
		cout << s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] << endl;
	}
	return 0;
}

标签:y2,前缀,int,基础,cin,算法,y1,x1
From: https://www.cnblogs.com/yhgm/p/18050605

相关文章

  • 【基础算法】离散化
    离散化//每日一题#include<bits/stdc++.h>usingnamespacestd;constintN=1000010;intn,m;inta[N],d[N],s[N],t[N];longlongb[N];boolcheck(intx){ memset(b,0,sizeofb); for(inti=1;i<=x;i++) { b[s[i]]+=d[i]; b[t[i]+1]......
  • 【基础算法】差分
    差分//每日一题#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=200010;intn;inta[N],s[N];intmain(){ cin>>n; for(inti=1;i<=n;i++) { cin>>a[i]; s[i]=s[i-1]+a[i];//前缀和 } L......
  • Java:基础语法
    注释平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到一个注释了,注释就类似于我们上学时候写的笔记,我们看着笔记就知道自己写的什么东西了!在程序中也是如此。我们来看一下Java中的注释怎么写,看以下代码:/**@DescriptionH......
  • 【基础算法】二分查找
    二分查找什么是二分?将问题分成两个部分。猜数游戏计算机给你一个范围内的随机数,你要输入一个数,计算机给你反馈是太大了还是太小了,直到你输出正确的答案。怎么设计这个程序呢?#include<iostream>#include<ctime>usingnamespacestd;intmain(){srand(time(NULL));......
  • 【基础算法】二分答案
    二分答案什么是二分答案?将答案区间进行二分,不断缩小答案区间,直到区间缩小到符合题意的答案。我们又该怎么书写呢?常用的二分模版://不断缩小答案区间while(l<=r){intmid=l+r>>1;if(check(mid))r=mid-1;elsel=mid+1;}模版的含义\(......
  • nginx系列文章01---基础知识
    1.何为反向代理?在介绍反向代理之前,先来了解一下正向代理。正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,下面是正向代理的原理图。由于工作环境原因,日常工作只能局限于单位的......
  • 如何判断算法的好坏?
    事后统计法(直接运行两个算法程序后比较运行速度)1.过于依赖测试数据 2.过于依赖硬件条件事前分析法     时间复杂度  大O表示法  ......
  • 动手学强化学习(五):时序差分算法
    第5章时序差分算法5.1简介第4章介绍的动态规划算法要求马尔可夫决策过程是已知的,即要求与智能体交互的环境是完全已知的(例如迷宫或者给定规则的网格世界)。在此条件下,智能体其实并不需要和环境真正交互来采样数据,直接用动态规划算法就可以解出最优价值或策略。这就好比对于......
  • 手写HashMap基础部分代码
    代码展示:packagecom.north.hashmap;importjava.util.Map;/***@AuthorNorth*@Date2024/3/3*手写HashMap*/@SuppressWarnings("all")publicclassMyHashMap<K,V>{/***哈希表*/privateNode<K,V>[]table;......
  • Nestjs系列 Nestjs基础(二)
    providers使用该内容可以结合Nestjs中文网-自定义提供者查看创建一个nest项目,创建一个Personcrud模块。providers写法providers完整和简写@Injectable()装饰器将PersonService类标记为提供者。然后在Module中声明,即和PersonService做关联,个人感觉provider......