A08 前缀和 二维前缀和

视频链接:A08 前缀和 二维前缀和_哔哩哔哩_bilibili

 

Luogu P8218 【深进1.例1】求区间和 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int n,m;
int a[100005],s[100005];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
      scanf("%d",&a[i]);
        s[i]=s[i-1]+a[i];
    }
    
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int l,r; scanf("%d%d",&l,&r);
        printf("%d\n",s[r]-s[l-1]);
    }
}

 

Luogu P2280 [HNOI2003] 激光炸弹 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=5005;
int n,m; //n个目标, 边长为m的正方形
int s[N][N]; //价值前缀和

int main(){
  cin>>n>>m; for(int i=0; i<n; i++){
    int x,y,v; 
    cin>>x>>y>>v;
    x++,y++; //坐标偏移一下
    s[x][y]+=v;
  }
  
  for(int i=1; i<=5001; i++)
    for(int j=1; j<=5001; j++)
      s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
      
  int res=0;
  for(int i=m; i<=5001; i++)
    for(int j=m; j<=5001; j++)
      res=max(res,s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m]);
  cout<<res;
}

 

Luogu P1387 最大正方形

#include<bits/stdc++.h>
using namespace std;

int n,m,a[103][103];

int main(){
  cin>>n>>m;
  for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++){
      cin>>a[i][j];
      a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1];
    }

  int ans=1;
  for(int s=2;s<=min(n,m);s++)
    for(int i=s; i<=n; i++)
      for(int j=s; j<=m; j++)
        if(a[i][j]-a[i-s][j]-a[i][j-s]+a[i-s][j-s]==s*s) ans=s;
  cout<<ans;
}

 

拓展:

高维前缀和总结(sosdp) - heyuhhh - 博客园 (cnblogs.com)

专题——高维前缀和 - Ruakker - 洛谷博客 (luogu.org)

 

posted @ 2023-07-03 16:02  董晓  阅读(1434)  评论(0)    收藏  举报