首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >前缀和算法

前缀和算法

作者头像
用户11719958
发布2025-12-30 14:53:10
发布2025-12-30 14:53:10
940
举报

一,一维前缀和模板

1,题目描述 

给你一个数组arr,进行q次询问,每次询问数组区间[l,r]的和。

2,思路

解法一:模拟该过程,每进行一次询问,遍历一次数组。时间复杂度为O(n*q),会超时。

解法二:使用前缀和数组,图示:

3,代码实现 
代码语言:javascript
复制
#include <iostream>
using namespace std;
#include<vector>

int main() 
{
     int n,q;
     cin>>n>>q;
     vector<int> arr(n+1);
     for(int i=1;i<=n;i++)
     cin>>arr[i];

     //创建dp表
     vector<long long> dp(n+1);//防止溢出
     //初始化
     for(int i=1;i<=n;i++)
     dp[i]=dp[i-1]+arr[i];

     int l,r;
     //使用dp表
     while(q--)
     {
        cin>>l>>r;
        cout<<dp[r]-dp[l-1]<<endl;
     }
}

二,二维前缀和模板

1,题目描述 
2,思路

解法一:暴力解法—>模拟该过程,遍历矩阵,时间复杂度O(n*m*q)

解法二:前缀和矩阵   图示:

3,代码实现 
代码语言:javascript
复制
#include <iostream>
using namespace std;
#include <vector>
int main() 
{
    int n=0,m=0,q=0;
    cin>>n>>m>>q;
    vector<vector<int>> arr(n+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    cin>>arr[i][j];

    //预处理前缀和矩阵
    vector<vector<long long>> dp(n+1,vector<long long>(m+1));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    dp[i][j]=dp[i-1][j]+dp[i][j-1]+arr[i][j]-dp[i-1][j-1];

    //使用前缀和矩阵
    int x1,x2,y1,y2;
    while(q--)
    {
        cin>>x1>>y1>>x2>>y2;
        cout<<dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]<<endl;
    }
    return 0;

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,一维前缀和模板
  • 二,二维前缀和模板
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档