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

目录

一、一维前缀和

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;
}
相关推荐
wzdark12 小时前
基于堆的优先队列实现原理与复杂度分析4
算法
彧azz14 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
老王熬夜敲代码14 小时前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
hansang_IR14 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
见闻小天地14 小时前
简博斯JG-C系列彩色激光同轴位移计:摄像头模组对位与行程测量的技术价值观察
人工智能·算法
ChampaignWolf15 小时前
在 SAP S/4HANA 内部基于 ICF Handler 从零实现 ABAP MCP Server:架构、代码与踩坑实录
c++·架构·sap·abap·mcp
葫三生15 小时前
《论三生原理》神话学构想与“神话历史”理论、《古史中的神话》思路异同?
大数据·人工智能·科技·深度学习·算法
liliangcsdn15 小时前
因子分析指标概念与示例
算法·机器学习
尘客-追梦16 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
SupL!16 小时前
LoftQ原理
算法