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

目录

一、一维前缀和

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;
}
相关推荐
Escalating_xu6 分钟前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法
Brilliantwxx19 分钟前
【Linux】 进程(3)深度解析:从查看进程到进程状态
linux·服务器·网络·c++
啊啊啊啊啊!!!!23 分钟前
【c++】二叉搜索树
开发语言·c++
ShineWinsu44 分钟前
对于 C++:C++20中Concept(概念) 与 Coroutine(协程)的解析
linux·开发语言·网络·c++·c++20·epoll
纪念 2291 小时前
算法二叉树(一)
算法
疯狂打码的少年1 小时前
【数据结构】哈希表:构造与冲突处理
数据结构·笔记·哈希算法·散列表
liulilittle1 小时前
llmx 学习手册 06 —— CPU 指令集优化(AVX-512 三层演进)
c++·学习·算法·ai·llm
skr爱码士1 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt·系统架构·客户端
土司大王2 小时前
LeetCode hot100——相交链表
算法·leetcode·链表
土司大王2 小时前
LeetCode hot100——回文链表
算法·leetcode·链表