【前缀和】一维前缀和 & 二维前缀和

目录

一、一维前缀和

1.前缀和(模板)

2.最大子段和

二、二维前缀和

1.二维前缀和(模板)

2.激光炸弹


一、一维前缀和

1.前缀和(模板)

【模板】前缀和

答案如下:

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

const int N = 1e5 + 10;
long long a[N];

int main()
{
    int n,m;
    a[0] = 0;
    cin >> n >>m;
    for(int i = 1; i <= n; i++)
    {
        int e; cin >> e;
        a[i] = e + a[i-1];
    }
    while(m--)
    {
        int l,r;
        cin >> l >> r;
        long long sum = a[r] - a[l-1];
        cout << sum << endl;
    }
    return 0;
}

2.最大子段和

P1115 最大子段和 - 洛谷

答案如下:

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 2e5 + 10;
int a[N];

int main()
{
	int n; cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	int cnt = 0;
	int max = -1e5;
	for(int i = 1; i <= n; i++)
	{
		cnt += a[i];
		max = max < cnt ? cnt : max; 
		if(cnt < 0) cnt = 0;
	}
	cout << max;
	return 0;
}

二、二维前缀和

1.二维前缀和(模板)

【模板】二维前缀和

答案如下:

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 1e3 + 10;
long long arr[N][N];

int main()
{
    int n,m,q;
    cin >> n >> m >> q;
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
        {
            int e; cin >> e;
            arr[i][j] = arr[i][j-1] + arr[i-1][j] - arr[i-1][j-1] + e;
        }
    }
    while(q--)
    {
        int x1,y1,x2,y2;
        cin >> x1 >> y1 >> x2 >> y2;
        long long sum = arr[x2][y2] - arr[x2][y1-1] - arr[x1-1][y2] + arr[x1-1][y1-1];
        cout << sum << endl;
    }
    return 0;
}

2.激光炸弹

P2280 HNOI2003 激光炸弹 - 洛谷

答案如下:

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 5010;
int a[N][N];
int f[N][N]; 

int main()
{
	int n,m;
	cin >> n >> m;
	while(n--)
	{
		int x,y,v;
		cin >> x >> y >> v;
		x++; y++;
		a[x][y] += v;
	}
	n = 5001;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			f[i][j] = f[i][j-1] + f[i-1][j] - f[i-1][j-1] + a[i][j];
		}
	}
	
	int ret = 0;
    m = min(m,n);
	for(int i = m; i <= n; i++)
	{
		int x1 = i - m + 1;
		for(int j = m; j <= n; j++)
		{
			int y1 = j - m + 1;
			ret = max(ret,f[i][j] - f[i][y1-1] - f[x1-1][j] + f[x1-1][y1-1]); 
		}
	}
	cout << ret << endl;
	return 0;
}
相关推荐
myjs9991 小时前
意识的两种类型
c++
YL200404261 小时前
071字符串解码
数据结构·leetcode
林文韬3271 小时前
逐位二进制拼接 → 翻转 → 去头零 → 消邻重
算法
变量未定义~1 小时前
单点修改、区间求和(模板)、区间修改,单点查询(模板)
数据结构·算法
weixin_468466852 小时前
SURF 图像特征提取算法新手实战指南
图像处理·人工智能·算法·机器视觉·surf·sift
Lumos_7772 小时前
程序的诞生
c++
basketball6162 小时前
C++ static_cast 完全解析
开发语言·c++
weixin_468466852 小时前
支持向量机新手实战指南
人工智能·python·算法·机器学习·支持向量机
LinHenrY12272 小时前
数据结构(二叉树)
数据结构